java位运算符【 与(&)、非(~)、或(|)、异或(^)、左移(<<)、右移(>>)、无符合右移(>>>)】

2,506 阅读6分钟

Java中的七种位运算

其中位非(~)是一元运算符,其他都是二元运算符。

1.位与运算符(&)

运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。

比如:130&129.

130转换成二进制就是10000010,129转换成二进制就是10000001。从高位开始比较得到,得到10000000,即128.

2.位非运算符(~)

运算规则:如果当前位为0,结果是1,如果当前位为1,结果是0.

比如:~36

在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.

八进制转为二进制是100100.

补码后为: 00000000 00000000 00000000 00100100

取反为: 11111111 11111111 11111111 11011011

因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。

因此,我们可将这个二进制数的补码进行还原: 首先,末尾减1得反码:11111111 11111111 11111111 11011010 其次,将各位取反得原码:

00000000 00000000 00000000 00100101,此时二进制转原码为37

所以~36 = -37

3.位或运算符(|)

运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。

比如:130|129.

130转换成二进制就是10000010,129转换成二进制就是10000001。从高位开始比较得到,得到10000011,即131.

4.位异或运算(^)

运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1

比如:6^8.

8转为二进制是1000,6转为二进制是0110.从高位开始比较得到的是:0001.然后二进制转为十进制,就是1;

5、<< 左移

两个左尖括号表示左移运算符,运算符规则是:各二进位全部左移若干位,高位丢弃,低位补0。

例如:6 << 2 = 24

0000 0000 0000 0000 0000 0000 0000 0110     -> 6
0000 0000 0000 0000 0000 0000 0001 1000     -> 6 << 2 = 24
  • 我们将6的二进位向左移动两位,低位补上两个0,高位丢弃,得出来的结果就是24。 左移常被用来做 * (2 ^ n)的运算,因为直接基于二进制运算,所以左移效率比 * (2 ^ n)高。

6、>>右移

两个右尖括号表示右移运算符,运算符规则是:各二进位全部右移若干位,正数高位补0,负数高位补1,低位丢弃。

例如: 12 >> 2 = 3

0000 0000 0000 0000 0000 0000 0000 1100     -> 12
0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >> 2 = 3
  • 因为12是正数,右移过程中高位补上两个0,低位丢弃,得出来的结果就是3。 例如:-12 >> 2 = -3

这里简单介绍一下:原码、反码、补码

  • 原码 是一个整数按照绝对值大小转换成的二进制数
  • 反码 说白了就是原码反着来
  • 补码 = 反码 +1
  • 补码就是负数在计算机中的二进制表示方法

那么-12在二进制中怎么标识呢?

原码
0000 0000 0000 0000 0000 0000 0000 1100
反码
1111 1111 1111 1111 1111 1111 1111 0011
补码 = 反码+1
1111 1111 1111 1111 1111 1111 1111 0100
  • 所以-12在二进制中的代码为
1111 1111 1111 1111 1111 1111 1111 0100

其实也可以通过(原码-1)取其反码,即可得到-12的二进制码

跑题了,咱们接着说回右移操作 -12 >> 2 = -3

1111 1111 1111 1111 1111 1111 1111 0100    -> -12
1111 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = -3

因为-12是负数,右移过程中高位补上两个1,低位丢弃,得出来的结果就是-3。 右移常被用来做 / (2 ^ n)的运算,因为直接基于二进制运算,所以右移效率比 / (2 ^ n)高。

7、>>>无符号右移

三个右尖括号表示无符号右移运算符,运算符规则是:各二进位全部右移若干位,高位补0,低位丢弃。

其实无符合右移和右移的区别就是不用关心是正数还是负数,右移时高位都补0。

例如: 12 >>> 2 = 3

0000 0000 0000 0000 0000 0000 0000 1100     -> 12
0000 0000 0000 0000 0000 0000 0000 0011     -> 12 >>> 2 = 3
  • 我们将12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是3。 例如:-12 >>> 2 = 1073741821
1111 1111 1111 1111 1111 1111 1111 0100    -> -12
0011 1111 1111 1111 1111 1111 1111 1101    -> -12 >> 2 = 1073741821

我们将-12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是1073741821。