C int 変数のビットを反転するのに本当に苦労しています。私は次のようにやっています:
input = 15;
input = ~input;
printf("%d", input);
しかし、それは常にとして表示され-16
ます。そうあるべき0
です!15
と書かれている場合1111
、なぜ返されるの10000
ですか?! これは腹立たしいです!誰か助けてくれませんか!?
C int 変数のビットを反転するのに本当に苦労しています。私は次のようにやっています:
input = 15;
input = ~input;
printf("%d", input);
しかし、それは常にとして表示され-16
ます。そうあるべき0
です!15
と書かれている場合1111
、なぜ返されるの10000
ですか?! これは腹立たしいです!誰か助けてくれませんか!?
int
システムでは32ビットの数値である可能性が高いため、元の数値で重要でないゼロであったビットを含め、すべてのビットが反転されます。
00000000000000000000000000001111
になります
11111111111111111111111111110000
これは負の数です。の最上位ビット15
はゼロであるため1
、反転するとになります。
元の数値のビットのみを保持したい場合は、次のように、数値の重要な位置にあるすべてのビットでマスクする必要があります。
printf("%d\n", input & 0xF);
AND
最後の4つを除くすべてのビットを0xF
「カットオフ」します。
これはinput
、 が 4 ビット以上で構成されているために発生しています。それが8 ビット (または 1 バイト)の でinput
あると仮定すると、次のようになります。signed char
input == 15 == 0x0F == 0b00001111
ご覧のとおり、 の上位 4 ビットinput
はすべて 0 です。ビット単位の NOT 演算 (~) の後は、次のようになります。
~input == -16 == 0xF0 == 0b11110000
ゼロだった 4 ビットが 1 になり、1 がゼロになりました。符号付き変数の最上位ビットによってその符号が決まります (0 が正、1 が負)。したがって、ビットを反転することにより、符号が反転されます。負の数は次のように読み取ることができます。
1 1 1 1 0 0 0 0
-128 + 64 + 32 + 16 + 0 + 0 + 0 + 0
これは、出力された -16 に解決されます。
宿題がビットごとの NOT を使用して変数をゼロにすることである場合は、符号ビットについて心配する必要がないようにinput
、 として宣言してみてください。unsigned char
次に、8 ビット変数が保持できる最大値 (または) に設定input
します。255
0xFF
0b11111111
15
タイプint
です。大きさにもよりますint
が、の表現はで15
終わりますが、sの束で1111
始まります0
。
~
演算子はすべてのビットを反転します。1
s(4つ)はs0
になり、0
s(N-4)は1
sになります。