2

バイナリ リテラルを使用したビットごとの比較で実際に何が起こるか知りたいです。私はちょうど次のことに出くわしました:

byte b1 = (new Byte("1")).byteValue();

// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0'));
// output: 00000001

System.out.println(b1 ^ 0b00000001);
// output: 0

したがって、すべてが期待どおりに動作し、xor比較は等しいです0。ただし、負の数で同じことをしようとすると、うまくいきません:

byte b2 = (new Byte("-1")).byteValue();

// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0'));
// output: 11111111

System.out.println(b2 ^ 0b11111111);
// output: -256

xor最後の比較も等しいと予想していました0。ただし、これは、バイナリリテラルを明示的にキャストした場合にのみ当てはまりbyteます。

byte b2 = (new Byte("-1")).byteValue();

// check the bit representation
System.out.println(String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0'));
// output: 11111111

System.out.println(b2 ^ (byte)0b11111111);
// output: 0

xor私にとっては、比較前は同じように見え、同じビット表現b10b11111111持っているので、それらがint(または他の何かに)キャストされたとしても、xorは 等しいはず0です。どのようにして結果が-256211111111 11111111 11111111 00000000進表現になるのでしょうか? byteを取得するために明示的なキャストを行う必要があるのはなぜ0ですか?

4

2 に答える 2

1

特定のキャストのないバイナリ リテラルは、桁数に関係なく、32 ビットの整数値を表します。たとえば0b00000001、 の省略形です0b00000000 00000000 00000000 00000001

Java でのビット単位の比較では、2 進数の昇格が使用されます( Javadocsを参照)。この特定のケースではint、比較が実行される前に両方のオペランドが変換されることを意味します。

0b11111111はすでにint(先頭0の s なしで) を表し0b00000000 00000000 00000000 11111111、 を表すだけb2ですが、 は値を表すバイトです-1int値への変換中に保持されるため、同じ数値 ( )b2を表す 32 ビット整数にキャストされます。-10b11111111 11111111 11111111 11111111

次に、は の 32 ビット バイナリ表現であるとxor評価されます。0b11111111 11111111 11111111 00000000-256

xorバイナリ リテラルを使用して比較が実行される場合(byte)0b11111111、バイトとしても扱われるため、同等に を表す 32 ビット整数にキャストされ-1ます。

double, float, longバイナリ比較は、または( Javadocsintで指定されているように) のいずれかで実行されることに注意することが重要です。比較に他のタイプしか参加していない場合 (たとえば)、それらは に変換されます。そのため、次のコードではコンパイル エラーが発生します。byteint

byte b1 = (byte)0b00000001;
byte b2 = (byte)0b00000001;
byte b3 = b1 & b2;

>>> error: incompatible types: possible lossy conversion from int to byte

... 2 つのビットごとの比較の結果byteint.

ここで行うことができる理由についてさらに読む:

于 2015-11-12T09:51:04.070 に答える
0

b1 ^ 0b11111111実際に使用するときはxor、byte から int への byte変換は 8 ビットの変数ですが、 int32 ビットの数値です。だから、あなたがしたことは次のとおりです: b1 ^ 0b(00000000 00000000 00000000 11111111) したがってxorbyte(その前に追加の1を使用してintで使用します。負の数であるため、1です。正の場合は0になります)int、結果は整数になりますあなたの場合、-256。

整数をキャストすると、2バイトの間byteで使用xorされ、結果はバイトになります。

于 2015-10-22T13:54:43.970 に答える