こんにちは、現役SEの「とも」です。
今回はシフト演算子についてです。
- シフト演算子は、「ビットを右や左にシフトする」ための演算子です。
- 整数型の「リテラル」または「変数」が使用できます。
シフト演算子は非常に高速ですが、用途が特殊なのでビット演算子と同じくメモリ制限が厳しい環境や高パフォーマンスが必要な「ゲーム」や「画像、映像系」でよく使われます。
シフト演算子もビット演算子と同じく、ビジネス系ではあまり利用する機会は無いと思います。
シフト演算子は、ビット演算子と組み合わせて使用されることが多いと思います。
【シフト演算子】
演算子 | 例 | 説明 |
---|---|---|
<< | A << B | Aのビットを左にBビットシフトする。 |
>> | A >> B | Aのビットを符号ありで右側にBビットシフトする。 |
>>> | A >>> B | Aのビットを符号なしで右側にBビットシフトする。 |
各ビット演算子のサンプル
【左シフト(<<)】
左へのビットシフトは、1ビット左に移動するごとに2のべき乗分だけ掛け算した結果になる
1ビット左シフト:2^1 = 2倍
2ビット左シフト:2^2 = 4倍
3ビット左シフト:2^3 = 8倍
4ビット左シフト:2^4 = 16倍
int a = 0b0000_0000_0000_0000_0000_0000_0000_0001;
int b = a << 1; // 1ビット左シフト
int c = a << 2; // 2ビット左シフト
int d = a << 3; // 3ビット左シフト
int e = a << 4; // 4ビット左シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット左シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット左シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット左シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【4ビット左シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット左シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット左シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット左シフト結果】");
System.out.println(String.format("%s\t", e) + "【4ビット左シフト結果】");
【結果】
【2進数で表示】
00000000000000000000000000000001 【aの値】
--------------------------------
00000000000000000000000000000010 【1ビット左シフト結果】
00000000000000000000000000000100 【2ビット左シフト結果】
00000000000000000000000000001000 【3ビット左シフト結果】
00000000000000000000000000010000 【4ビット左シフト結果】
【10進数で表示】
1 【aの値】
--------------------------------
2 【1ビット左シフト結果】
4 【2ビット左シフト結果】
8 【3ビット左シフト結果】
16 【4ビット左シフト結果】
【注意点】
ビットの最大桁数をオーバーしてシフトした時、予想外の挙動になるため、適切に処理する必要があります。
左シフトを扱う場合、以下は注意点になります。
- 符号ビットの考慮はされないため、10進数で見たときに最大桁のビットが1になると急にマイナス値になる。
- 最大桁よりも左にシフトしたビットは、削除される。
- 最大桁のビット数をシフトすると、0ビットシフトと同じ結果になる。
【予想外の挙動サンプル】
int a = 0b0000_0000_0000_0000_0000_0000_0000_0011;
int b = a << 29; // 29ビット左シフト
int c = a << 30; // 30ビット左シフト
int d = a << 31; // 31ビット左シフト
int e = a << 32; // 32ビット左シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【29ビット左シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【30ビット左シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【31ビット左シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【32ビット左シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【29ビット左シフト結果】");
System.out.println(String.format("%s\t", c) + "【30ビット左シフト結果】");
System.out.println(String.format("%s\t", d) + "【31ビット左シフト結果】");
System.out.println(String.format("%s\t", e) + "【32ビット左シフト結果】");
【結果】
【2進数で表示】
00000000000000000000000000000011 【aの値】
--------------------------------
01100000000000000000000000000000 【29ビット左シフト結果】
11000000000000000000000000000000 【30ビット左シフト結果】
10000000000000000000000000000000 【31ビット左シフト結果】
00000000000000000000000000000011 【32ビット左シフト結果】
【10進数で表示】
3 【aの値】
--------------------------------
1610612736 【29ビット左シフト結果】
-1073741824 【30ビット左シフト結果】
-2147483648 【31ビット左シフト結果】
3 【32ビット左シフト結果】
【右シフト符号あり(>>)】
- 右へのビットシフトは、1ビット右に移動するごとに2のべき乗分だけ割り算した結果になる
1ビット右シフト:2^-1 = 1/2倍
2ビット右シフト:2^-2 = 1/4倍
3ビット右シフト:2^-3 = 1/8倍
4ビット右シフト:2^-4 = 1/16倍
int a = 0b0000_0000_0000_0000_0000_0000_0001_0000;
int b = a >> 1; // 1ビット右シフト
int c = a >> 2; // 2ビット右シフト
int d = a >> 3; // 3ビット右シフト
int e = a >> 4; // 4ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【4ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【4ビット右シフト結果】");
【結果】
【2進数で表示】
00000000000000000000000000010000 【aの値】
--------------------------------
00000000000000000000000000001000 【1ビット右シフト結果】
00000000000000000000000000000100 【2ビット右シフト結果】
00000000000000000000000000000010 【3ビット右シフト結果】
00000000000000000000000000000001 【4ビット右シフト結果】
【10進数で表示】
16 【aの値】
--------------------------------
8 【1ビット右シフト結果】
4 【2ビット右シフト結果】
2 【3ビット右シフト結果】
1 【4ビット右シフト結果】
【マイナス符号の場合】
int a = 0b1111_1111_1111_1111_1111_1111_1111_0000;
int b = a >> 1; // 1ビット右シフト
int c = a >> 2; // 2ビット右シフト
int d = a >> 3; // 3ビット右シフト
int e = a >> 4; // 4ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【4ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【4ビット右シフト結果】");
【結果】
【2進数で表示】
11111111111111111111111111110000 【aの値】
--------------------------------
11111111111111111111111111111000 【1ビット右シフト結果】
11111111111111111111111111111100 【2ビット右シフト結果】
11111111111111111111111111111110 【3ビット右シフト結果】
11111111111111111111111111111111 【4ビット右シフト結果】
【10進数で表示】
-16 【aの値】
--------------------------------
-8 【1ビット右シフト結果】
-4 【2ビット右シフト結果】
-2 【3ビット右シフト結果】
-1 【4ビット右シフト結果】
【注意点】
ビットの最小桁数をオーバーしてシフトした時、以下の挙動になる
右シフトを扱う場合、以下は注意点になります。
- 最小桁よりも右にシフトしたビットは切り捨てられ、符号を除く最大桁は符号ビットで埋まる。
- 最大桁のビット数をシフトすると、0ビットシフトと同じ結果になる。
【予想外の挙動サンプル(正の値)】
int a = 0b0000_0000_0000_0000_0000_0000_0000_0011;
int b = a >> 1; // 1ビット右シフト
int c = a >> 2; // 2ビット右シフト
int d = a >> 3; // 3ビット右シフト
int e = a >> 31; // 31ビット右シフト
int f = a >> 32; // 32ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【31ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(f)).replace(" ", "0") + "【32ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【31ビット右シフト結果】");
System.out.println(String.format("%s\t", f) + "【32ビット右シフト結果】");
【結果】
【2進数で表示】
00000000000000000000000000000011 【aの値】
--------------------------------
00000000000000000000000000000001 【1ビット右シフト結果】
00000000000000000000000000000000 【2ビット右シフト結果】
00000000000000000000000000000000 【3ビット右シフト結果】
00000000000000000000000000000000 【31ビット右シフト結果】
00000000000000000000000000000011 【32ビット右シフト結果】
【10進数で表示】
3 【aの値】
--------------------------------
1 【1ビット右シフト結果】
0 【2ビット右シフト結果】
0 【3ビット右シフト結果】
0 【31ビット右シフト結果】
3 【32ビット右シフト結果】
【予想外の挙動サンプル(負の値)】
int a = 0b1111_1111_1111_1111_1111_1111_1111_1100;
int b = a >> 1; // 1ビット右シフト
int c = a >> 2; // 2ビット右シフト
int d = a >> 3; // 3ビット右シフト
int e = a >> 31; // 31ビット右シフト
int f = a >> 32; // 32ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【31ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(f)).replace(" ", "0") + "【32ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【31ビット右シフト結果】");
System.out.println(String.format("%s\t", f) + "【32ビット右シフト結果】");
【結果】
【2進数で表示】
11111111111111111111111111111100 【aの値】
--------------------------------
11111111111111111111111111111110 【1ビット右シフト結果】
11111111111111111111111111111111 【2ビット右シフト結果】
11111111111111111111111111111111 【3ビット右シフト結果】
11111111111111111111111111111111 【31ビット右シフト結果】
11111111111111111111111111111100 【32ビット右シフト結果】
【10進数で表示】
-4 【aの値】
--------------------------------
-2 【1ビット右シフト結果】
-1 【2ビット右シフト結果】
-1 【3ビット右シフト結果】
-1 【31ビット右シフト結果】
-4 【32ビット右シフト結果】
【右シフト符号なし(>>>)】
- 右へのビットシフトは、1ビット右に移動するごとに2のべき乗分だけ割り算した結果になります。(>>と同じ挙動)
- ただし、負の数の場合の挙動が異なり、符号ビットは常に0で埋められます。
1ビット右シフト:2^-1 = 1/2倍
2ビット右シフト:2^-2 = 1/4倍
3ビット右シフト:2^-3 = 1/8倍
4ビット右シフト:2^-4 = 1/16倍
int a = 0b0000_0000_0000_0000_0000_0000_0001_0000;
int b = a >>> 1; // 1ビット右シフト
int c = a >>> 2; // 2ビット右シフト
int d = a >>> 3; // 3ビット右シフト
int e = a >>> 4; // 4ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【4ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【4ビット右シフト結果】");
【結果】
【2進数で表示】
00000000000000000000000000010000 【aの値】
--------------------------------
00000000000000000000000000001000 【1ビット右シフト結果】
00000000000000000000000000000100 【2ビット右シフト結果】
00000000000000000000000000000010 【3ビット右シフト結果】
00000000000000000000000000000001 【4ビット右シフト結果】
【10進数で表示】
16 【aの値】
--------------------------------
8 【1ビット右シフト結果】
4 【2ビット右シフト結果】
2 【3ビット右シフト結果】
1 【4ビット右シフト結果】
【マイナス符号の場合】
int a = 0b1111_1111_1111_1111_1111_1111_1111_0000;
int b = a >>> 1; // 1ビット右シフト
int c = a >>> 2; // 2ビット右シフト
int d = a >>> 3; // 3ビット右シフト
int e = a >>> 4; // 4ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【4ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【4ビット右シフト結果】");
【結果】
【2進数で表示】
11111111111111111111111111110000 【aの値】
--------------------------------
01111111111111111111111111111000 【1ビット右シフト結果】
00111111111111111111111111111100 【2ビット右シフト結果】
00011111111111111111111111111110 【3ビット右シフト結果】
00001111111111111111111111111111 【4ビット右シフト結果】
【10進数で表示】
-16 【aの値】
--------------------------------
2147483640 【1ビット右シフト結果】
1073741820 【2ビット右シフト結果】
536870910 【3ビット右シフト結果】
268435455 【4ビット右シフト結果】
【注意点】
ビットの最小桁数をオーバーしてシフトした時、以下の挙動になる
右シフトを扱う場合、以下は注意点になります。
- 最小桁よりも右にシフトしたビットは切り捨てられ、符号ビットは0で埋まる。
- 最大桁のビット数をシフトすると、0ビットシフトと同じ結果になる。
【予想外の挙動サンプル(正の値)】
int a = 0b0000_0000_0000_0000_0000_0000_0000_0011;
int b = a >>> 1; // 1ビット右シフト
int c = a >>> 2; // 2ビット右シフト
int d = a >>> 3; // 3ビット右シフト
int e = a >>> 31; // 31ビット右シフト
int f = a >>> 32; // 32ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【31ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(f)).replace(" ", "0") + "【32ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【31ビット右シフト結果】");
System.out.println(String.format("%s\t", f) + "【32ビット右シフト結果】");
【結果】正の数の場合は>>と同じ挙動
【2進数で表示】
00000000000000000000000000000011 【aの値】
--------------------------------
00000000000000000000000000000001 【1ビット右シフト結果】
00000000000000000000000000000000 【2ビット右シフト結果】
00000000000000000000000000000000 【3ビット右シフト結果】
00000000000000000000000000000000 【31ビット右シフト結果】
00000000000000000000000000000011 【32ビット右シフト結果】
【10進数で表示】
3 【aの値】
--------------------------------
1 【1ビット右シフト結果】
0 【2ビット右シフト結果】
0 【3ビット右シフト結果】
0 【31ビット右シフト結果】
3 【32ビット右シフト結果】
【予想外の挙動サンプル(負の値)】
int a = 0b1111_1111_1111_1111_1111_1111_1111_1100;
int b = a >>> 1; // 1ビット右シフト
int c = a >>> 2; // 2ビット右シフト
int d = a >>> 3; // 3ビット右シフト
int e = a >>> 31; // 31ビット右シフト
int f = a >>> 32; // 32ビット右シフト
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【1ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【2ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(d)).replace(" ", "0") + "【3ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(e)).replace(" ", "0") + "【31ビット右シフト結果】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(f)).replace(" ", "0") + "【32ビット右シフト結果】");
System.out.println("");
System.out.println("【10進数で表示】");
System.out.println(String.format("%s\t", a) + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%s\t", b) + "【1ビット右シフト結果】");
System.out.println(String.format("%s\t", c) + "【2ビット右シフト結果】");
System.out.println(String.format("%s\t", d) + "【3ビット右シフト結果】");
System.out.println(String.format("%s\t", e) + "【31ビット右シフト結果】");
System.out.println(String.format("%s\t", f) + "【32ビット右シフト結果】");
【結果】負の数の場合は>>と異なる挙動
【2進数で表示】
11111111111111111111111111111100 【aの値】
--------------------------------
01111111111111111111111111111110 【1ビット右シフト結果】
00111111111111111111111111111111 【2ビット右シフト結果】
00011111111111111111111111111111 【3ビット右シフト結果】
00000000000000000000000000000001 【31ビット右シフト結果】
11111111111111111111111111111100 【32ビット右シフト結果】
【10進数で表示】
-4 【aの値】
--------------------------------
2147483646 【1ビット右シフト結果】
1073741823 【2ビット右シフト結果】
536870911 【3ビット右シフト結果】
1 【31ビット右シフト結果】
-4 【32ビット右シフト結果】
以上、長くなりましたがビットシフトでした。