2 の補数の計算がうまくいきません。
C が b=5 の場合にすべてのビットを -6 に反転する ~b をコンパイルすることを知っています。しかし、なぜ?
int b=101、すべてのビットを反転すると 010 となり、2 の補数表記では 1 を足すだけですが、それは 011、つまり 3 となり、不正解です。
ビット反転演算子 ~ でどのように計算すればよいですか?
2 の補数の計算がうまくいきません。
C が b=5 の場合にすべてのビットを -6 に反転する ~b をコンパイルすることを知っています。しかし、なぜ?
int b=101、すべてのビットを反転すると 010 となり、2 の補数表記では 1 を足すだけですが、それは 011、つまり 3 となり、不正解です。
ビット反転演算子 ~ でどのように計算すればよいですか?
実際、メモリ内で 5 が通常どのように表現されるか (16 ビット整数) は次のとおりです。
0000 0000 0000 0101
5 を反転すると、すべてのビットが反転して次のようになります。
1111 1111 1111 1010
これは、実際には 10 進数で -6 です。あなたの質問では、実際には整数を構成するすべてのビットを考慮する必要があるときに、最後の 3 ビットのみを反転していたと思います。
問題b = 101 (5)
は、選択した 2 進数が少なすぎることです。
binary | decimal
~101 = 010 | ~5 = 2
~101 + 1 = 011 | ~5 + 1 = 3
4 ビットを選択すると、期待どおりの結果が得られます。
binary | decimal
~0101 = 1010 | ~5 = -6
~0101 + 1 = 1011 | ~5 + 1 = -5
わずか 3 ビットで、2 の補数表現で -4 から +3 までの整数をエンコードできます。4 ビットを使用すると、2 の補数表現で -8 から +7 までの整数をエンコードできます。
-6 は 2 に切り捨てられ、-5 は 3 ビットで 3 に切り捨てられていました。少なくとも 4 ビットが必要でした。
そして、他の人がすでに指摘しているように、~
単に値のすべてのビットを反転するので、~~17
= 17
.
~
数値のすべてのビットを単純に反転します。
~(~a)=17 if a=17
~0...010001 = 1...101110 ( = -18 )
~1...101110 = 0...010001 ( = 17 )
数値を否定する場合 (2 の補数を取得する場合) にのみ 1 を追加する必要があります。つまり、17 のうち -17 を取得します。
~b
は 2 の補数演算ではありません。これはビット単位の NOT 演算です。数値のすべてのビットを反転するだけなので、~b
とは等しくありません-b
。
例:
b = 5
binary representation of b: 0000 0000 0000 0101
binary representation of ~b: 1111 1111 1111 1010
~b = -6
b = 17
binary representation of b: 0000 0000 0001 0001
binary representation of ~b: 1111 1111 1110 1110
~b = -18
binary representation of ~(~b): 0000 0000 0001 0001
~(~b) = 17
~b + 1 = -b
そう:
~(~b)
等しい~(-b - 1)
等しい-(-b - 1) -1
等しいb
実際、~
すべてのビット~
を逆にします。もう一度行うと、元に戻ります。
b を整数として宣言しました。つまり、b の値は 32 ビットで格納され、補数 (~) は最後の 3 ビットではなく 32 ビット ワードで行われます。
int b=5 // b in binary: 0000 0000 0000 0101
~b // ~b in binary: 1111 1111 1111 1010 = -6 in decimal
最上位ビットには整数の符号 (1:負 0:正) が格納されるため、1111 1111 1111 1010 は 10 進数で -6 になります。
同様に:
b=17 // 17 in binary 0000 0000 0001 0001
~b // = 1111 1111 1110 1110 = -18