void getBin(int num, char *str)
getBin()num数値 ( ) と書き込む文字列( str)を取ります
*(str+16) = '\0';
の最後の文字がstrNULL ターミネータに設定されています
int mask = 0x8000 << 1;
という変数を作成し、mask0x10000 である 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かどうかを確認します文字列。== 00
一度に 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して格納すると、ポスト インクリメントが文字列内の次の文字に移動します。