java 的位运算符有&,| ,^,~,<<,>>,>>> 一共七个
位运算符是不支持浮点类型运算的,其中&,|,^ 这三个运算符可以支持boolean类型,其它4个不支持boolean类型
位运算一般用于整数的计算,主要针对二进制的运算
& (与运算符)
两个操作数中位数都为1,结果才为1,否则结果为0
例如:5 & 4
5 -> 101
4 -> 100
101
&
100
--------------
100
| (或运算符)
两个操作数中只要有一个位数为1,结果就为1,否则为0
例如: 5 | 4
5 -> 101
4 -> 100
101
^
100
--------------
001
^(异或运算)
两个操作数中只要两个位数不相同就为1,否则为0
例如:5^4
101
^
100
--------------
001
~(取反运算)
正数:先将数值转换成二进制,在对二进制数的每一位取反操作包括符号位,在取补码,计算结果
此处以1字节为例
例如:~5
5 转换成二进制:0000 0101
每一位取反:1111 1010
在取补码:1000 0101 ,注意取补码需要 +1
此时:1000 0110
结果为:-6
负数:先将数值转换成二进制,由于负数在计算机是以补码的方式存储,因此取补码,在对每一位取反包括符号位,此时符号为正,在取补码,计算得结果。
例如:~(-5)
-5转换成二进制:1000 0101
由于是负数,计算机以补码的方式存储,此时取补码:1111 1011
在对每一位取反:0000 0100,
在取补码,由于正数的补码是其本身,因此为:0000 0100
结果为:4
取反的简便计算公式:- (a + 1)
<< 左移运算
将数值转换成二进制,整体往左移动若干位,左边超出部分舍弃,右边补零
左移一位相当于乘于2的一次方,左移n位相当于乘于2的n次方(在没有溢出的情况下)
例如: 5 << 1 = 10
↓
101 左移一位 1010 转换成十进制:10
如果移动超出位数出现溢出,计算结果错误
>>右移运算
将数值转换成二进制,整体往右移动若干位,左边用原有的标志位填充,右边超出的舍弃
右移一位相当于除于2的一次方,右移n位相当于除于2的n次方(在没有溢出的情况下)
例如:4 >> 1 = 2
↓
100 右移一位 10 转换成十进制:2