9

C int 変数のビットを反転するのに本当に苦労しています。私は次のようにやっています:

input = 15;

input = ~input;

printf("%d", input);

しかし、それは常にとして表示され-16ます。そうあるべき0です!15と書かれている場合1111、なぜ返されるの10000ですか?! これは腹立たしいです!誰か助けてくれませんか!?

4

3 に答える 3

16

intシステムでは32ビットの数値である可能性が高いため、元の数値で重要でないゼロであったビットを含め、すべてのビットが反転されます。

00000000000000000000000000001111

になります

11111111111111111111111111110000

これは負の数です。の最上位ビット15はゼロであるため1、反転するとになります。

元の数値のビットのみを保持したい場合は、次のように、数値の重要な位置にあるすべてのビットでマスクする必要があります。

printf("%d\n", input & 0xF);

AND最後の4つを除くすべてのビットを0xF「カットオフ」します。

于 2012-08-23T03:33:49.513 に答える
5

これは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

于 2012-08-23T04:06:02.427 に答える
3

15タイプintです。大きさにもよりますintが、の表現はで15終わりますが、sの束で1111始まります0

~演算子はすべてのビットを反転します1s(4つ)はs0になり、0s(N-4)は1sになります。

于 2012-08-23T03:34:38.680 に答える