2017-01-19 8 views
-5

誰かがこのC++プログラムの仕組みを助けてくれますか?それは10進数を2進数に変換します。なぜ左シフトと右シフトが使われるのですか?このC++プログラムの仕組みは?

void static inline unsignedToBinary(unsigned x, char*& bin) 
{ 
    bin = (char*) malloc(33); 

    int p = 0; 
    for (unsigned i = (1 << 31); i > 0; i >>= 1) 
    bin[p++] = ((x&i) == i) ? '1' : '0'; 
    bin[p] = '\0'; 
} 
+7

これは、デバッガを使用する方法を学ぶ絶好の機会です。変数を見ながら行単位でステップ実行します。 – drescherjm

+0

なぜですか?バイナリなので。 – LogicStuff

+0

'bin =(char *)malloc(33);'については、std :: vector 静的インラインunsignedToBinary(unsigned x) 'と' std :: vector bin(33); 'または少なくとも 'bin = new char [33];' binにあったものが流出していないことを確認するチェックがありますか? – user4581301

答えて

6

これは、ビット操作を使用するバイナリ変換の簡単な実装です。 kビットの位置である2 K値を含むint -

  • 変数iマスクを表します。
  • 初期値は左シフト1for
  • 31によってループ 1はそれからシフトアウトされるまで i == 0を作り、マスクを右シフトする >>= 1を使用して製造し、2 です。
  • 各繰り返しにおいて、x&iは、iと比較されます。比較は、xがの1の位置に1の位置にある場合に成功します。それ以外の場合は失敗します。

注: C++でmallocは確かに許可されている使用しますが、それは理想的ではありません。 Cの文字列を使用する場合は、代わりにnew char[33]を使用してください。 C++のようなアプローチは、std::stringを使用します。

+0

ありがとう! バイナリに負の数を実装するにはどうすればよいですか? 空隙静的インラインswordToBinary(INT X、チャー*&ビン) { \t} – Sepideha

+0

@Sepideha同じ実装が動作しようとしています。システムの実際の表現が表示されます。これは、数字の冒頭に多くのものが含まれていることをほぼ確実に示します。 – dasblinkenlight