学习笔记:java之位运算

在阅读 EnumSet 源码时发现涉及到了位运算的操作,复习一下

左移

  • << 为算数左移,将以二进制表示的数字中的0和1向左平移相应的位数,移位产生的空缺用零来补充;正负数没有区别
1
2
3
4
5
6
7
8
9
System.out.println(Integer.toBinaryString(-1));
System.out.println(Integer.toBinaryString(-1 << 16));
// 11111111111111111111111111111111
// 11111111111111110000000000000000

System.out.println(Integer.toBinaryString(121));
System.out.println(Integer.toBinaryString(121 << 1));
// 1111001
// 11110010

右移

  • >> 为算数右移(arithmetic shift right),将以二进制表示的数字中的0和1向右平移相应的位数,对于由于位移产生的空缺,负数用1补,正数用0补
  • >>> 为逻辑右移(logical shift right),和算数右移同理,但是空缺的位数都是用0补
1
2
3
4
5
6
7
8
9
10
11
12
13
System.out.println(Integer.toBinaryString(-13));
System.out.println(Integer.toBinaryString(-13 >> 2));
System.out.println(Integer.toBinaryString(-13 >>> 2));
// 11111111111111111111111111110011
// 11111111111111111111111111111100
// 00111111111111111111111111111100

System.out.println(Integer.toBinaryString(121));
System.out.println(Integer.toBinaryString(121 >> 1));
System.out.println(Integer.toBinaryString(121 >>> 1));
// 00000000000000000000000001111001
// 00000000000000000000000000111100
// 00000000000000000000000000111100

  • ~ 把0变成1,把1变成0
1
2
3
4
5
6
7
8
9
10
// 为了方便找规律我把高位补0了
System.out.println(Integer.toBinaryString(-13));
System.out.println(Integer.toBinaryString(~-13));
// 11111111111111111111111111110011
// 00000000000000000000000000001100

System.out.println(Integer.toBinaryString(121));
System.out.println(Integer.toBinaryString(~121));
// 00000000000000000000000001111001
// 11111111111111111111111110000110

& 两个二进制数进行与运算,对应位上只要有0则结果对应位为0,否则为1

1
2
3
4
5
6
7
8
System.out.println(Integer.toBinaryString(121));
System.out.println(Integer.toBinaryString(-13));
System.out.println(Integer.toBinaryString(121 & -13));

// 为了方便找规律我把高位补0了
// 00000000000000000000000001111001
// 11111111111111111111111111110011
// 00000000000000000000000001110001

|两个二进制数进行与运算,对应位上只要有1则结果对应位为1,否则为0

1
2
3
4
5
6
7
8
System.out.println(Integer.toBinaryString(121));
System.out.println(Integer.toBinaryString(-13));
System.out.println(Integer.toBinaryString(121 | -13));

// 为了方便找规律我把高位补0了
// 00000000000000000000000001111001
// 11111111111111111111111111110011
// 11111111111111111111111111111011

异或

^ 两个二进制数进行与运算,对应位上数字不相同则结果对应位为1,否则为0

1
2
3
4
5
6
7
8
System.out.println(Integer.toBinaryString(121));
System.out.println(Integer.toBinaryString(-13));
System.out.println(Integer.toBinaryString(121 | -13));

// 为了方便找规律我把高位补0了
// 00000000000000000000000001111001
// 11111111111111111111111111110011
// 11111111111111111111111110001010