void getBin(int num, char *str)
getBin()
num
数値 ( ) と書き込む文字列( str
)を取ります
*(str+16) = '\0';
の最後の文字がstr
NULL ターミネータに設定されています
int mask = 0x8000 << 1;
という変数を作成し、mask
0x10000 である 1 だけ左にシフトされた 0x8000 に設定します。なんで?バイナリで見やすいかもしれません:
0x8000 16 => 1000 0000 0000 0000 2 (次にすべてを 1 桁左に移動)
1 0000 0000 0000 0000 2 => 0x10000 16
while(mask >>= 1)
mask
が 0 より大きい間、 1 ビット右にシフトし、結果を に保存しmask
ます。(>>=
右にシフトして保存することを意味します)。つまり、値は次のようになります。
0x10000 16 == 1 000 0000 0000 0000 0000 2 == 65536 10
0x8000 16 == 1000 0000 0000 0000 2 == 32768 10
0x4000 16 == 100 0000 0000 0000 2 == 16384 10
0x2000 16 = 10 0000000000000000002 = = 8192 10
...
0x4 16 == 100 2 == 4 10
0x2 16 == 10 2 == 2 10
0x1 16 == 1 2 == 1 10
最後に、これらの反復のそれぞれについて:
*str++ = !!(mask & num) + '0';
このコードは の各数字を取り、num
に設定されている 1 ビットと AND 演算し、結果が次のようになっているmask
かどうかを確認します文字列。== 0
0
一度に 1 ステップずつ分解してみましょう。
mask & num // num is 3334 = 0011 0011 0011 0100
// mask starts at = 1000 0000 0000 0000
したがって、最初の反復での値は(mask & num)
です0
。
!!(x)
は、次のように言っているのと同じです:(x == 0 ? 0 : 1)
最初の反復で0 が得られる0
ので!!(0)
、それを文字列に格納したいのですが、それを ASCII 文字にしたいのです。0 の ASCII 文字は 0x30 16なので、0 に 0x30 を追加して 0x30 (または'0'
)を取得します。
*str++ = '0';
文字 0を逆参照str
して格納すると、ポスト インクリメントが文字列内の次の文字に移動します。