注意

位, 是从最右边的位数开始的, 最右边的位为第0位.

位移

左移

int a = 1 << 0
int b = 1 << 1

右移

int a = 1 >> 0;
int b = 1 >> 1;

设置第 x 位

number |= (1 << x)

例如:

int a = 0;
a |=(1 << 5);
System.out.println(a);
System.out.println(Integer.toBinaryString(a));

输出结果:

32
100000

清除第 x 位

number &= ~(1 << x)

说明: ~ 表示异或, 即对应位为0时, 返回的是1. 对应位为1时, 返回的是0. 然后 &= , 即与异或的结果再进行位与.就是设置某位为0了.

例如

        int a = 0;
        a |=(1 << 5);
        a |=(1 << 8);
        System.out.println(a);
        System.out.println(Integer.toBinaryString(a));

        //清除第5位
        a &= ~(1 << 5);
        System.out.println(Integer.toBinaryString(a));

输出结果

288
100100000
100000000

切换 x 位.即1变成0, 0变成1

number ^= (1<< x)

例如

        int a = 0;
        a |=(1 << 5);
        a |=(1 << 8);
        System.out.println(a);
        System.out.println(Integer.toBinaryString(a));

        //切换第5位. 上面设置为1了, 现在把它设置为0
        a ^= (1 << 5);
        System.out.println(Integer.toBinaryString(a));

        //上面设置为0了, 现在再切换为1
        a ^= (1 << 5);
        System.out.println(Integer.toBinaryString(a));

输出结果

288
100100000
100000000
100100000

检测 x 位是否为1

((number >> x) & 1) == 1

例如

        int a = 0;
        a |= (1 << 5);
        a |= (1 << 8);
        System.out.println(a);
        System.out.println(Integer.toBinaryString(a));

        //检测第5位是否为1
        boolean _5thBit = ((a >> 5) & 1) == 1;
        System.out.println(_5thBit);

输出结果

288
100100000
true

填充所有位为1

number = ~(number & 0)

例如:

        int a = 0;
        a = ~(a & 0);
        System.out.println(a);
        System.out.println(Integer.toBinaryString(a));

输出结果:

-1
11111111111111111111111111111111

参考资料