ビット演算子
なぜか唐突に、ビット演算子で「0xaaaaaaaa」と「0x2aaaaaaa」をシフトしてみようと思ったらしい。
public class Main { public static void main(String[] args) { int[] nums = { 0xaaaaaaaa, 0x2aaaaaaa, }; for (int n : nums) { System.out.printf("=== %08x ===%n", n); for (int i = -36; i <= 36; ++i) { System.out.printf("| %4d | %32s | %32s | %32s |%n", i, String.format("%32s", Integer.toBinaryString(n << i)).replace(" ", "0"), String.format("%32s", Integer.toBinaryString(n >> i)).replace(" ", "0"), String.format("%32s", Integer.toBinaryString(n >>> i)).replace(" ", "0")); } System.out.println(); } } }
このプログラムの実行結果。
=== aaaaaaaa === | -36 | 10100000000000000000000000000000 | 11111111111111111111111111111010 | 00000000000000000000000000001010 | | -35 | 01000000000000000000000000000000 | 11111111111111111111111111111101 | 00000000000000000000000000000101 | | -34 | 10000000000000000000000000000000 | 11111111111111111111111111111110 | 00000000000000000000000000000010 | | -33 | 00000000000000000000000000000000 | 11111111111111111111111111111111 | 00000000000000000000000000000001 | | -32 | 10101010101010101010101010101010 | 10101010101010101010101010101010 | 10101010101010101010101010101010 | | -31 | 01010101010101010101010101010100 | 11010101010101010101010101010101 | 01010101010101010101010101010101 | | -30 | 10101010101010101010101010101000 | 11101010101010101010101010101010 | 00101010101010101010101010101010 | | -29 | 01010101010101010101010101010000 | 11110101010101010101010101010101 | 00010101010101010101010101010101 | | -28 | 10101010101010101010101010100000 | 11111010101010101010101010101010 | 00001010101010101010101010101010 | | -27 | 01010101010101010101010101000000 | 11111101010101010101010101010101 | 00000101010101010101010101010101 | | -26 | 10101010101010101010101010000000 | 11111110101010101010101010101010 | 00000010101010101010101010101010 | | -25 | 01010101010101010101010100000000 | 11111111010101010101010101010101 | 00000001010101010101010101010101 | | -24 | 10101010101010101010101000000000 | 11111111101010101010101010101010 | 00000000101010101010101010101010 | | -23 | 01010101010101010101010000000000 | 11111111110101010101010101010101 | 00000000010101010101010101010101 | | -22 | 10101010101010101010100000000000 | 11111111111010101010101010101010 | 00000000001010101010101010101010 | | -21 | 01010101010101010101000000000000 | 11111111111101010101010101010101 | 00000000000101010101010101010101 | | -20 | 10101010101010101010000000000000 | 11111111111110101010101010101010 | 00000000000010101010101010101010 | | -19 | 01010101010101010100000000000000 | 11111111111111010101010101010101 | 00000000000001010101010101010101 | | -18 | 10101010101010101000000000000000 | 11111111111111101010101010101010 | 00000000000000101010101010101010 | | -17 | 01010101010101010000000000000000 | 11111111111111110101010101010101 | 00000000000000010101010101010101 | | -16 | 10101010101010100000000000000000 | 11111111111111111010101010101010 | 00000000000000001010101010101010 | | -15 | 01010101010101000000000000000000 | 11111111111111111101010101010101 | 00000000000000000101010101010101 | | -14 | 10101010101010000000000000000000 | 11111111111111111110101010101010 | 00000000000000000010101010101010 | | -13 | 01010101010100000000000000000000 | 11111111111111111111010101010101 | 00000000000000000001010101010101 | | -12 | 10101010101000000000000000000000 | 11111111111111111111101010101010 | 00000000000000000000101010101010 | | -11 | 01010101010000000000000000000000 | 11111111111111111111110101010101 | 00000000000000000000010101010101 | | -10 | 10101010100000000000000000000000 | 11111111111111111111111010101010 | 00000000000000000000001010101010 | | -9 | 01010101000000000000000000000000 | 11111111111111111111111101010101 | 00000000000000000000000101010101 | | -8 | 10101010000000000000000000000000 | 11111111111111111111111110101010 | 00000000000000000000000010101010 | | -7 | 01010100000000000000000000000000 | 11111111111111111111111111010101 | 00000000000000000000000001010101 | | -6 | 10101000000000000000000000000000 | 11111111111111111111111111101010 | 00000000000000000000000000101010 | | -5 | 01010000000000000000000000000000 | 11111111111111111111111111110101 | 00000000000000000000000000010101 | | -4 | 10100000000000000000000000000000 | 11111111111111111111111111111010 | 00000000000000000000000000001010 | | -3 | 01000000000000000000000000000000 | 11111111111111111111111111111101 | 00000000000000000000000000000101 | | -2 | 10000000000000000000000000000000 | 11111111111111111111111111111110 | 00000000000000000000000000000010 | | -1 | 00000000000000000000000000000000 | 11111111111111111111111111111111 | 00000000000000000000000000000001 | | 0 | 10101010101010101010101010101010 | 10101010101010101010101010101010 | 10101010101010101010101010101010 | | 1 | 01010101010101010101010101010100 | 11010101010101010101010101010101 | 01010101010101010101010101010101 | | 2 | 10101010101010101010101010101000 | 11101010101010101010101010101010 | 00101010101010101010101010101010 | | 3 | 01010101010101010101010101010000 | 11110101010101010101010101010101 | 00010101010101010101010101010101 | | 4 | 10101010101010101010101010100000 | 11111010101010101010101010101010 | 00001010101010101010101010101010 | | 5 | 01010101010101010101010101000000 | 11111101010101010101010101010101 | 00000101010101010101010101010101 | | 6 | 10101010101010101010101010000000 | 11111110101010101010101010101010 | 00000010101010101010101010101010 | | 7 | 01010101010101010101010100000000 | 11111111010101010101010101010101 | 00000001010101010101010101010101 | | 8 | 10101010101010101010101000000000 | 11111111101010101010101010101010 | 00000000101010101010101010101010 | | 9 | 01010101010101010101010000000000 | 11111111110101010101010101010101 | 00000000010101010101010101010101 | | 10 | 10101010101010101010100000000000 | 11111111111010101010101010101010 | 00000000001010101010101010101010 | | 11 | 01010101010101010101000000000000 | 11111111111101010101010101010101 | 00000000000101010101010101010101 | | 12 | 10101010101010101010000000000000 | 11111111111110101010101010101010 | 00000000000010101010101010101010 | | 13 | 01010101010101010100000000000000 | 11111111111111010101010101010101 | 00000000000001010101010101010101 | | 14 | 10101010101010101000000000000000 | 11111111111111101010101010101010 | 00000000000000101010101010101010 | | 15 | 01010101010101010000000000000000 | 11111111111111110101010101010101 | 00000000000000010101010101010101 | | 16 | 10101010101010100000000000000000 | 11111111111111111010101010101010 | 00000000000000001010101010101010 | | 17 | 01010101010101000000000000000000 | 11111111111111111101010101010101 | 00000000000000000101010101010101 | | 18 | 10101010101010000000000000000000 | 11111111111111111110101010101010 | 00000000000000000010101010101010 | | 19 | 01010101010100000000000000000000 | 11111111111111111111010101010101 | 00000000000000000001010101010101 | | 20 | 10101010101000000000000000000000 | 11111111111111111111101010101010 | 00000000000000000000101010101010 | | 21 | 01010101010000000000000000000000 | 11111111111111111111110101010101 | 00000000000000000000010101010101 | | 22 | 10101010100000000000000000000000 | 11111111111111111111111010101010 | 00000000000000000000001010101010 | | 23 | 01010101000000000000000000000000 | 11111111111111111111111101010101 | 00000000000000000000000101010101 | | 24 | 10101010000000000000000000000000 | 11111111111111111111111110101010 | 00000000000000000000000010101010 | | 25 | 01010100000000000000000000000000 | 11111111111111111111111111010101 | 00000000000000000000000001010101 | | 26 | 10101000000000000000000000000000 | 11111111111111111111111111101010 | 00000000000000000000000000101010 | | 27 | 01010000000000000000000000000000 | 11111111111111111111111111110101 | 00000000000000000000000000010101 | | 28 | 10100000000000000000000000000000 | 11111111111111111111111111111010 | 00000000000000000000000000001010 | | 29 | 01000000000000000000000000000000 | 11111111111111111111111111111101 | 00000000000000000000000000000101 | | 30 | 10000000000000000000000000000000 | 11111111111111111111111111111110 | 00000000000000000000000000000010 | | 31 | 00000000000000000000000000000000 | 11111111111111111111111111111111 | 00000000000000000000000000000001 | | 32 | 10101010101010101010101010101010 | 10101010101010101010101010101010 | 10101010101010101010101010101010 | | 33 | 01010101010101010101010101010100 | 11010101010101010101010101010101 | 01010101010101010101010101010101 | | 34 | 10101010101010101010101010101000 | 11101010101010101010101010101010 | 00101010101010101010101010101010 | | 35 | 01010101010101010101010101010000 | 11110101010101010101010101010101 | 00010101010101010101010101010101 | | 36 | 10101010101010101010101010100000 | 11111010101010101010101010101010 | 00001010101010101010101010101010 | === 2aaaaaaa === | -36 | 10100000000000000000000000000000 | 00000000000000000000000000000010 | 00000000000000000000000000000010 | | -35 | 01000000000000000000000000000000 | 00000000000000000000000000000001 | 00000000000000000000000000000001 | | -34 | 10000000000000000000000000000000 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | | -33 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | | -32 | 00101010101010101010101010101010 | 00101010101010101010101010101010 | 00101010101010101010101010101010 | | -31 | 01010101010101010101010101010100 | 00010101010101010101010101010101 | 00010101010101010101010101010101 | | -30 | 10101010101010101010101010101000 | 00001010101010101010101010101010 | 00001010101010101010101010101010 | | -29 | 01010101010101010101010101010000 | 00000101010101010101010101010101 | 00000101010101010101010101010101 | | -28 | 10101010101010101010101010100000 | 00000010101010101010101010101010 | 00000010101010101010101010101010 | | -27 | 01010101010101010101010101000000 | 00000001010101010101010101010101 | 00000001010101010101010101010101 | | -26 | 10101010101010101010101010000000 | 00000000101010101010101010101010 | 00000000101010101010101010101010 | | -25 | 01010101010101010101010100000000 | 00000000010101010101010101010101 | 00000000010101010101010101010101 | | -24 | 10101010101010101010101000000000 | 00000000001010101010101010101010 | 00000000001010101010101010101010 | | -23 | 01010101010101010101010000000000 | 00000000000101010101010101010101 | 00000000000101010101010101010101 | | -22 | 10101010101010101010100000000000 | 00000000000010101010101010101010 | 00000000000010101010101010101010 | | -21 | 01010101010101010101000000000000 | 00000000000001010101010101010101 | 00000000000001010101010101010101 | | -20 | 10101010101010101010000000000000 | 00000000000000101010101010101010 | 00000000000000101010101010101010 | | -19 | 01010101010101010100000000000000 | 00000000000000010101010101010101 | 00000000000000010101010101010101 | | -18 | 10101010101010101000000000000000 | 00000000000000001010101010101010 | 00000000000000001010101010101010 | | -17 | 01010101010101010000000000000000 | 00000000000000000101010101010101 | 00000000000000000101010101010101 | | -16 | 10101010101010100000000000000000 | 00000000000000000010101010101010 | 00000000000000000010101010101010 | | -15 | 01010101010101000000000000000000 | 00000000000000000001010101010101 | 00000000000000000001010101010101 | | -14 | 10101010101010000000000000000000 | 00000000000000000000101010101010 | 00000000000000000000101010101010 | | -13 | 01010101010100000000000000000000 | 00000000000000000000010101010101 | 00000000000000000000010101010101 | | -12 | 10101010101000000000000000000000 | 00000000000000000000001010101010 | 00000000000000000000001010101010 | | -11 | 01010101010000000000000000000000 | 00000000000000000000000101010101 | 00000000000000000000000101010101 | | -10 | 10101010100000000000000000000000 | 00000000000000000000000010101010 | 00000000000000000000000010101010 | | -9 | 01010101000000000000000000000000 | 00000000000000000000000001010101 | 00000000000000000000000001010101 | | -8 | 10101010000000000000000000000000 | 00000000000000000000000000101010 | 00000000000000000000000000101010 | | -7 | 01010100000000000000000000000000 | 00000000000000000000000000010101 | 00000000000000000000000000010101 | | -6 | 10101000000000000000000000000000 | 00000000000000000000000000001010 | 00000000000000000000000000001010 | | -5 | 01010000000000000000000000000000 | 00000000000000000000000000000101 | 00000000000000000000000000000101 | | -4 | 10100000000000000000000000000000 | 00000000000000000000000000000010 | 00000000000000000000000000000010 | | -3 | 01000000000000000000000000000000 | 00000000000000000000000000000001 | 00000000000000000000000000000001 | | -2 | 10000000000000000000000000000000 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | | -1 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | | 0 | 00101010101010101010101010101010 | 00101010101010101010101010101010 | 00101010101010101010101010101010 | | 1 | 01010101010101010101010101010100 | 00010101010101010101010101010101 | 00010101010101010101010101010101 | | 2 | 10101010101010101010101010101000 | 00001010101010101010101010101010 | 00001010101010101010101010101010 | | 3 | 01010101010101010101010101010000 | 00000101010101010101010101010101 | 00000101010101010101010101010101 | | 4 | 10101010101010101010101010100000 | 00000010101010101010101010101010 | 00000010101010101010101010101010 | | 5 | 01010101010101010101010101000000 | 00000001010101010101010101010101 | 00000001010101010101010101010101 | | 6 | 10101010101010101010101010000000 | 00000000101010101010101010101010 | 00000000101010101010101010101010 | | 7 | 01010101010101010101010100000000 | 00000000010101010101010101010101 | 00000000010101010101010101010101 | | 8 | 10101010101010101010101000000000 | 00000000001010101010101010101010 | 00000000001010101010101010101010 | | 9 | 01010101010101010101010000000000 | 00000000000101010101010101010101 | 00000000000101010101010101010101 | | 10 | 10101010101010101010100000000000 | 00000000000010101010101010101010 | 00000000000010101010101010101010 | | 11 | 01010101010101010101000000000000 | 00000000000001010101010101010101 | 00000000000001010101010101010101 | | 12 | 10101010101010101010000000000000 | 00000000000000101010101010101010 | 00000000000000101010101010101010 | | 13 | 01010101010101010100000000000000 | 00000000000000010101010101010101 | 00000000000000010101010101010101 | | 14 | 10101010101010101000000000000000 | 00000000000000001010101010101010 | 00000000000000001010101010101010 | | 15 | 01010101010101010000000000000000 | 00000000000000000101010101010101 | 00000000000000000101010101010101 | | 16 | 10101010101010100000000000000000 | 00000000000000000010101010101010 | 00000000000000000010101010101010 | | 17 | 01010101010101000000000000000000 | 00000000000000000001010101010101 | 00000000000000000001010101010101 | | 18 | 10101010101010000000000000000000 | 00000000000000000000101010101010 | 00000000000000000000101010101010 | | 19 | 01010101010100000000000000000000 | 00000000000000000000010101010101 | 00000000000000000000010101010101 | | 20 | 10101010101000000000000000000000 | 00000000000000000000001010101010 | 00000000000000000000001010101010 | | 21 | 01010101010000000000000000000000 | 00000000000000000000000101010101 | 00000000000000000000000101010101 | | 22 | 10101010100000000000000000000000 | 00000000000000000000000010101010 | 00000000000000000000000010101010 | | 23 | 01010101000000000000000000000000 | 00000000000000000000000001010101 | 00000000000000000000000001010101 | | 24 | 10101010000000000000000000000000 | 00000000000000000000000000101010 | 00000000000000000000000000101010 | | 25 | 01010100000000000000000000000000 | 00000000000000000000000000010101 | 00000000000000000000000000010101 | | 26 | 10101000000000000000000000000000 | 00000000000000000000000000001010 | 00000000000000000000000000001010 | | 27 | 01010000000000000000000000000000 | 00000000000000000000000000000101 | 00000000000000000000000000000101 | | 28 | 10100000000000000000000000000000 | 00000000000000000000000000000010 | 00000000000000000000000000000010 | | 29 | 01000000000000000000000000000000 | 00000000000000000000000000000001 | 00000000000000000000000000000001 | | 30 | 10000000000000000000000000000000 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | | 31 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | 00000000000000000000000000000000 | | 32 | 00101010101010101010101010101010 | 00101010101010101010101010101010 | 00101010101010101010101010101010 | | 33 | 01010101010101010101010101010100 | 00010101010101010101010101010101 | 00010101010101010101010101010101 | | 34 | 10101010101010101010101010101000 | 00001010101010101010101010101010 | 00001010101010101010101010101010 | | 35 | 01010101010101010101010101010000 | 00000101010101010101010101010101 | 00000101010101010101010101010101 | | 36 | 10101010101010101010101010100000 | 00000010101010101010101010101010 | 00000010101010101010101010101010 |
何かというと、int型に対するビット演算は32を法としたシフト距離が用いられる、すなわち「0ビットシフト」と「32ビットシフト」と「-32ビットシフト」と‥は同じ数値になるということ。同様に「1ビットシフト」と「33ビットシフト」と「-31ビットシフト」と‥は同じ(以下略)
注意したいのは、一回で0ビットシフトした場合と一回で32ビットシフトした場合が同じ数値になるということであって、「複数回に分けて合計で32ビットシフトした場合」とは異なる。
つまり、例えば
System.out.printf("%5d%n", 123 << 32); System.out.printf("%5d%n", (123 << 16) << 16);
の実行結果は、次のようになる。
123 0