2
#include <stdio.h>

int main()
{
  char str[17];
  getBin(3334, str);
  printf("%s\n", str);
  return 0;
}

void getBin(int num, char *str)
{
  *(str+16) = '\0';
  int mask = 0x8000 << 1;
  while(mask >>= 1)
    *str++ = !!(mask & num) + '0';
}

while ループの機能がよくわかりません。誰かがそれが何をしているのかを簡単に説明できますか? ありがとう

4

2 に答える 2

4

はい、そうです。= 0x80008 * 16^3 = 2^15 です。これをもう一度左にずらすと、2^16 になります。

while ループは、すべての値を連続的にマスクします。

  • 2^15
  • 2^14
  • 2^13 ...

そのため、while ループは mask を通常の整数の 2 のべき乗の反復子と見なします。

今何をし!!(mask & num)ますか?mask で示されるビットが反転している場合は 1 を返し、反転しているon場合は 0を返しますoff

!!(mask & num)は 0 または 1 を返し、その文字コードに追加すると、 または の文字コードが返され0ます。01

たとえば、 ifnum=12mask=4then !!(4 & 12) = !!(100 & 1100) = !!(100)= !0 = 1. さて、追加する1 + '0'と何が得られますか?1+48=49の文字コードを取得し1ます。

*str++ = ..、文字列内の特定の位置に値を割り当て、ポインターをインクリメントして次の文字を指すようにします。

問題は、strnull で終了するかどうかです。

*(str+16) = '\0';ヌル終了バイトを予防的に設定するため、行はヌル終了を処理すると思います。

これは、上で書いたコードの説明だと思います。

于 2013-03-13T07:33:49.690 に答える
1
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して格納すると、ポスト インクリメントが文字列内の次の文字に移動します。

于 2013-03-13T15:18:55.267 に答える