私は最近Javaコース(1週間のクラッシュコース)を受講し、いくつかの2進数学を取り上げました。
この単項〜演算子(チルダと呼ばれていると思いますか?)は、次のように説明されました。
ビットパターンを反転して、すべての「0」を「1」に、すべての「1」を「0」に変換します。たとえば、1バイトに8ビットがあります。次のバイトがある場合:00000000反転された値は11111111に変更されます。
上記の説明は明確で簡潔であり、私には完全に理にかなっています。つまり、私はそれを実装しようとするまで。
これを考えると:
byte x = 3;
byte y = 5;
System.out.println(~x);
System.out.println(~y);
出力は次のとおりです。
-4
-6
私はこれがどのように起こるかについて非常に混乱しています。
バイナリの+3が11の場合、これの反転は00になりますが、これは明らかに-3ではありません。
しかし、1バイトには8ビットがあるので、+ 3のバイナリ表現を00000011と書くべきではありませんか?
これは反転して11111100になります。10進値に戻すと252になります。ただし、+ 3を011と書くと、実際には100に変換されます。これは+4ですが、負の数であることをどのように知ることができますか。 ?
1100に変換される0011を試してみてはどうでしょうか。最初のビットを符号として使用すると、実際には-4になります。
ああ-それで、この時点で私はどこかに到達していると思った。
しかし、それから私はy=5の2番目の値に到達しました。
これをどのように書くのですか?同じロジックを使用して、+5はバイナリ0101に変換され、1010に反転します。
そして、私がひどく混乱しているのは今頃です。これは、-2の符号付きの値、または10進数で+10の符号なしの値のいずれかを表すように見えますか?どちらも私が印刷している-6ではありません。
繰り返しになりますが、長さを1バイトの8桁まで増やすと、+ 5は00000101になり、反転すると11111010になります。これを-6に変換する方法は実際には見つかりません。
ここで何が起こっているのかわからないので、そこにいる誰かがこれを理解していますか?私が印刷する数字が多いほど、私は混乱します。
グーグルはこれについて何も考え出していないようだ-多分それは小さなオペレーターのサインを見るのが好きではない..:-(