这篇文章上次修改于 2123 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

Java 位运算


| 或

规律

两个操作数对应位有一个为 1 时,结果就为 1,否则为 0.

示例

1100 0011
0100 1001

1100 1011

& 与

规律

只有两个操作数对应位同为 1 时,结果为 1,否则为 0.

示例

1100 0011
0100 1001

0100 0001

^ 异或

规律

两个操作数对应位相同时,结果为 0,否则为 1.

示例

1100 0011
0100 1001

1000 1010

~ 非

规律

所有位取反,数值为 1 时,结果为 0,数值为 0 时,结果为 1.

示例

1100 0011

0011 1100

>> 右位移

规律

所有位向右移一位,左边补符号位(正数补 0,负数补 1)

示例

//负数原码
1100 0011

//先求补码
1011 1101

//右移一位
1101 1110

//再取补码 再回到原码
1010 0010
补码的补码为原码

>>> 无符号右移

规律

所有位向右移一位,左边补 0

示例

//负数原码
1010 0011

//先求补码
1101 1101

//右移一位
0110 1110

//再取补码 再回到原码
0001 0010
此处示例只是说内存有 8 bit,如果按 int 4 字节 32 bit 来算的话,无符号右移的值会瞬间变得很大,可以自己试着理解一下

<< 左位移

规律

所有位向左移一位,右边补 0

示例

1100 0011

1000 0110

小结

我们总结一下这篇文章的要点

  1. 计算机在执行运算的时候都是先将数值转换成补码然后再运算的
  2. 补码的补码是原码

| & ~ 与我们 Java 中的逻辑运算符有点类似可以对应理解

附一张 Java 运算符优先级的图(在百度找的)
java - operator forrang.png