常见的位运算符如下图:
具体规则如下
第一部分:
- &----有0则0
- |------有1则1
- ^-----相同为0,不同为1
- ~-----0变1,1变0
// 分析 先把数据转换为二进制
// 3的二进制 11,补码 00000000 00000000 00000000 00000011
// 4的二进制100,补码 00000000 00000000 00000000 00000100
int a=3;
int b=4;
System.out.println(3&4); //0----有0则0
System.out.println(3|4); //111-----7 有1则1
System.out.println(3^4); //111------7 相同为0,不同为1
System.out.println(~3); //-4 0变1,1变0
// 补码:11111111 11111111 11111111 11111100
// 反码:11111111 11111111 11111111 11111011
// 原码:10000000 00000000 00000000 00000100
第二部分:
- 一个数据被位运算(^)俩次,其结果不变
System.out.println(3^4^4); //3 System.out.println(4^3^3); //4
- 把<<左边的数据向左移几位,相等于左边的数据乘以2的移动次幂
System.out.println(3<<2); // 3*2^2=12 /* <<左移 计算3的二进制:11 00000000 00000000 00000000 00000011 (00) 00000000 00000000 00000000 00001100 */
- 把>>左边的数据右移几位,相等于左边的数据除以2的移动次幂
System.out.println(-4>>2); //-4/2^2=-1 /* 计算出4的二进制:0100 原码:10000000 00000000 00000000 0000100 反码:11111111 11111111 11111111 1111011 补码:11111111 11111111 11111111 1111100 11111111 11111111 11111111 11111111(00) 补码 补码:11111111 11111111 11111111 11111111 反码:11111111 11111111 11111111 11111110 原码:10000000 00000000 00000000 00000001 结果:-1 */
-
>>>(无符号右移)------无论最高位是0还是1,左边补齐0
System.out.println(-4>>>2); /* 计算出4的二进制:0100 原码:10000000 00000000 00000000 0000100 反码:11111111 11111111 11111111 1111011 补码:11111111 11111111 11111111 1111100 0011111111 11111111 11111111 11111(00) 结果:1073741823 */
注意:
- 首先把数据转换为二进制
- &,|,^当俩边是数据做位运算,俩边是布尔值做逻辑运算