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します。2550xFF0b11111111
15タイプintです。大きさにもよりますintが、の表現はで15終わりますが、sの束で1111始まります0。
~演算子はすべてのビットを反転します。1s(4つ)はs0になり、0s(N-4)は1sになります。