11010100 << 1が10101000ではなく110101000に等しいのはなぜですか?


40

11010100 2のビットをシフトしようとすると、結果は10101000 2ではなく110101000 2になります。

int a = Integer.parseInt("11010100", 2) << 1;

私はこれをやろうとします:

int a = (byte)(Integer.parseInt("11010100", 2) << 1);

しかし、出力値が128より大きい場合、すべてがマイナスになり、これは論理的です。ビット数が変わらないようにするにはどうすればよいですか?


4
整数演算は常にintsまたはlongsで行われます。
Tom Hawtin-タックライン

34
32ビット長の整数を使用しています。なぜ結果が8ビットに切り捨てられると思いますか?
ジャモン

1
バイトa = ...修正します。
Perdi Estaquel

回答:


61

一度に一歩ずつ進みましょう。

  1. Integer.parseInt("11010100", 2)-これはint値212です。ちなみに、これは不要です。あなただけ書くことができます:0b11010100

  2. 0b11010100 << 10b110101000はと同じで、424です。

  3. 次に、それをバイトにキャストします(byte)(0b11010100 << 1)。最初の8個を超えるビットはすべて失われ、0b10101000、つまり-88が残ります。マイナス、はい。Javaではバイトが署名されるためです。

  4. 次に、この-88をint値に割り当てるときに、これを暗黙的にintにキャストします。それは-88のままです。これは、すべての上位ビットがすべて1であることを意味します。

したがって、最終的な値は-88です。

168代わりに表示したい場合(まったく同じビットですが、符号付きではなく符号なしで表示されます)、通常のトリックは& 0xFF、最初の8以外のすべてのビットを0に設定して正の数を保証することです。

byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.

// or in one go:

System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168

19
彼は値をに格納しているint aので、があれば& 0xFF、キャストする必要はまったくありません。 int a = (0b11010100<< 1) & 0xFF;
Mooing Duck

9

下位8ビットよりも高いすべてのビットを0に設定する場合は、ビット単位のANDを使用できます。

int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));

出力:

10101000

6

このようなものを試してください:

int anInt = Integer.parseInt("11010100", 2) << 1;
int asUnsignedInt= Byte.toUnsignedInt((byte) anInt);

toUnsignedIntはJava SE 8で導入されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.