1

バイトから整数への変換に関して少し混乱しています。次のコードを検討してください。

byte[] data = new byte[] { 0, (byte) 0xF0 };

int masked = data[0] << 8 & 0xFF | data[1] & 0xFF; //240
int notMasked = data[0] << 8 | data[1]; //-16

Java のバイトは符号付きでdata[1]あるため、10 進数の 240 ではなく、2 の補数である -16 です。ただし、それでもバイナリで0x11110000ある必要がありますdata[1] & 0xFF

Javaは、演算子に渡す前にすべてを整数に変換してい|ますか? なぜ&0xFF違いを生むのですか?

4

2 に答える 2

4

Javaバイトは(残念ながら)符号付きです-したがってint、ビット単位で実行するために値をにプロモートすると、最終|的にはとして符号拡張され0xFFFFFFF0ます。次に、を台無しに|data[0]ます。によるマスキングは、代わり& 0xffに240の整数値(ちょうど0x000000F0)に変換します。

しかし、あなたは問題を抱えています。このコード:

int masked = data[0] << 8 & 0xFF | data[1] & 0xFF;

する必要があります:

int masked = ((data[0] & 0xff) << 8) | (data[1] & 0xFF);

...それ以外の場合は、シフトにマスキングしているため、機能しません。の存在がわからないので、括弧を追加しました&<<そして|...

于 2012-12-07T10:20:15.387 に答える
1

知られている「パズル」に似ています

byte x = -1;
x = x >>>= 1;
System.out.println(x);

生産する

-1

シフトなし?これは、算術/シフト/比較式をコンパイルする前に、javac が byte (および short と char) を int または long (式に long がある場合) にプロモートするため、次のように動作するためです。

x -> int = 0xFFFFFFFF; 0xFFFFFFF >>> 1 = 0x7FFFFFF; (byte)0x7FFFFFF -> 0xFF
于 2012-12-07T11:00:16.237 に答える