12

私は最近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に変換する方法は実際には見つかりません。

ここで何が起こっているのかわからないので、そこにいる誰かがこれを理解していますか?私が印刷する数字が多いほど、私は混乱します。

グーグルはこれについて何も考え出していないようだ-多分それは小さなオペレーターのサインを見るのが好きではない..:-(

4

4 に答える 4

8

このデモを参照してください:-

3 ->  0011
~3 -> 1100  -> -4 (2's complement)

5 -> 0101
~5 -> 1010 -> -6 (2's complement)

符号付き整数は2の補数として格納されるため、をとる2's complementと。さて、は負の数です。したがって、結果はです。の場合も同様です。110041100-41010

1100 
0011  - 1's complement
0100  - 2's complement  - value = 4 (take negative)
于 2012-11-23T21:32:40.480 に答える
4

ウィキペディアから:2の補数表記では、非負の数は通常の2進表現で表されます。この場合、最上位ビットは0です。2の補数演算は否定演算であるため、負の数は絶対値の2の補数で表されます。
2進数の2の補数を取得するには、ビット単位のNOT演算を使用して、ビットを反転または「反転」します。次に、値1が結果の値に追加され、2の補数0をとるときに発生するオーバーフローは無視されます。http://en.wikipedia.org/wiki/Two%27s_complement

したがって、+ 5である0101がある場合、その逆は-5である1010です。

010を5として実際に読み取ることはありませんが、最初に1が表示されている場合、数値を取得するには、残りの桁を再度反転して、否定する正の数値を取得する必要があることがわかります。 。それが理にかなっている場合。

これまでに作業したことがない場合は、少し異質な概念です。それは確かに10進数が機能する方法ではありませんが、何が起こっているかを見ると実際には簡単です。

10進数の8の値は01010として書き込まれ、10101に否定されます。最初の桁(1)は負であることを意味し、残りを裏返して数値1010を取得します。

覚えておくべきことの1つは、2の補数は、通常の古いバイナリシステムのカウントと同じではないということです。通常のバイナリでは、10101の値(上記の2の補数では-8)はもちろん21です。これが混乱の原因だと思います。それらを見て、どのように違いを区別しますか?数値の値が実際に何であるかを判断するには、どの表現が使用されているかを知る必要があります。わずかに異なる1の補数もあります。

1の補数と2の補数を含む、2進数学に関する優れたチュートリアルがここにあります。 http://www.math.grin.edu/~rebelsky/Courses/152/97F/Readings/student-binary

于 2012-11-27T22:25:15.497 に答える
2

符号付き整数は、ほぼ普遍的に2の補数を使用して格納されます。これは、ビットを反転して(1の補数を取り)、1を追加することを意味します。このように、整数ゼロの2つの表現(+0と-0)がなく、特定の符号付き操作をハードウェアに実装するのが簡単になります。

于 2012-11-23T21:33:00.870 に答える
2

Javaは、2の補数で符号付き数値を使用します。タイプを「unsignedint」または「unsignedchar」として使用する場合、Cまたは他の言語での推論は正しいでしょう。

于 2012-11-23T21:34:39.387 に答える