2 -22 : ビットシフト右辺値還元

ビットシフト右辺値還元

<<,>>>,>> のビットシフト演算では、右辺値が大きい値でも対象の型のサイズで余剰した値でビットシフトされる。
通常
int a = 1;
a = a << 1;
の場合は a の各ビットが左に1ビット移動するが、
a = a << 33;
の場合は、33 を intのサイズ 32 で割った余り 1 がシフト数になるので、内部では
a = a << 1;
として動作する。これは char, byte, short, longでも同様となっている。 float, double にはビットシフト演算子は利用できないためコンパイルエラーとなる。

[BitShiftRestore.java]
/**
* ビットシフト右辺値還元 テストクラス
*/
public class BitShiftRestore {

public static void main(String[] args) {

int a = 1;
int b = 1;

// int は 32ビットなので
// 右辺値 % 32 の値でビットシフトされる
int c = a << 32; // a << 0; と同じ
int d = b << 33; // a << 1; と同じ

System.out.println("a(1) << 32 = " + c);
System.out.println("b(1) << 33 = " + d);
}
}

実行結果
a(1) << 32 = 1
b(1) << 33 = 2