ここに小さな例があります。
int a = 11; //1 0 1 1 is bit representation
System.out.println(~a);
Output: -12
私が理解しているように、「~」演算子はビットを反転します-つまり、1 0 1 1 は 0 1 0 0 になるはずなので、出力は 4 になるはずです。何が欠けていますか?
ここに小さな例があります。
int a = 11; //1 0 1 1 is bit representation
System.out.println(~a);
Output: -12
私が理解しているように、「~」演算子はビットを反転します-つまり、1 0 1 1 は 0 1 0 0 になるはずなので、出力は 4 になるはずです。何が欠けていますか?
11
は ではなく1011
、次のように表されます: -
0000 0000 0000 0000 0000 0000 0000 1011
先頭の が表示されていることに気付いていないだけです0's
。int
s は 32 ビットであることを思い出してください。
今、次の~11
ようになります: -
1111 1111 1111 1111 1111 1111 1111 0100
したがって、これは負の数です。したがって、2 の補数を取ると、次のようになります。
0000 0000 0000 0000 0000 0000 0000 1011 // 1's complement
0000 0000 0000 0000 0000 0000 0000 1100 // 2's complement == -12
したがって、 を取得します-12
。
int は 4 よりもはるかに多くの桁数です。実際には、入力する前に 0 がたくさんあります。
コンピュータ上の負の数は、通常、1 で始まるものとして表されます。通常、-1 はすべて 1、-2 は ..11111111111111110、-3 は ..1111111111111101 などです。\
これらのゼロをすべて 1 に変更したため、得られたのは負の数でした。
あなたの番号を見たい場合は、 ~a & 0xf を使用してください
0xf は ...000001111 の「マスク」を提供します
それと AND 処理されたものは、最後の 4 ビットのみを保持し、残りはすべてゼロになります。
すばらしい質問です。人々がまだこのような実験を行ったり考えたりしているのを見てうれしいです。