読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

ビット演算子

なぜか唐突に、ビット演算子で「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