Java 位运算符 &、|、^、~、<<、>>
位运算符指的是 与(&
)、或(|
)、异或(^
)、取反(~
)、左移(<<
)、右移(>>
)。
位运算其实就是二进制的运算,加减乘除适用于十进制,而位运算就是二进制的运算。
我们编码中最小的单位是字节,而一个字节有8位,每一位就是一个0或1,所以将十进制的 “1” 用二进制表示就是00000001
,十进制的 “2” 用二进制表示就是00000010
…
1. 与
运算符 (&
)
如果 5&9
那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制
5 : 0000 0101
9 : 0000 1001
将二进制上下对比取 “1” 的交集,
1 : 0000 0001
简单来说,1表示true,0表示false,而与运算的时候相同位之间其实就是两个Boolean的运算,
上下对应的看,该位上的两个,全true(1),即为true(1),全false(0),即为false(0),一个false(0)一个true(1),还是false(0)。
2. 或
运算符(|
)
如果 5|10
那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制
5 : 0000 0101
10 : 0000 1010
将二进制上下对比取 “1” 的并集,
15 : 0000 1111
简单来说,1表示true,0表示false,而与运算的时候相同位之间其实就是两个Boolean的运算,
上下对应的看,该位上的两个,遇true(1)就是true(1),无true(1)就是false(0)。
3. 异或
运算符(^
)
如果 7^14
那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制
7 : 0000 0111
14 : 0000 1110
将二进制上下对比取 “1” 的对称差,
9 : 0000 1001
简单来说,1表示true,0表示false,而与运算的时候相同位之间其实就是两个Boolean的运算,
上下对应的看,该位上的两个,只要相同都是false(0),只有不同才是true(1)。
4. 取反
运算符(~
)
如果 ~1
那么这个应该怎么运算呢?
取反运算其实挺简单的,就是在二进制中,把1变0,0变1
注意:二进制中,最高位是符号位 1表示负数,0表示正数
编程时: ~1
输出结果为 -2
。
计算机存储时是按照补码存储的。
计算步骤:
1的二进制表示--------------------------------0000 0001
按位取反----------------------------------------1111 1110 (计算机以补码形式存储,所以要求11111110的补码)
求补码-------------------------------------------1000 0010(11111110除符号位,其他位取反加一)
因此 ~1 =-2
5. 左移
运算(<<
)
如果 5 << 2
那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制 ,
5 : 0000 0101
然后二进制中的所有的 “1” 向左移动两位
20 : 0001 0100
总结规律后得出一个快速的算法
M
<
<
n
=
M
∗
2
n
M << n = M * 2^{n}
M<<n=M∗2n
6. 右移
运算(>>
)
如果 20 >> 2
那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制 ,
20 : 0001 0100
然后二进制中的所有的 “1” 向右移动两位
5 : 0000 0101
总结规律后得出一个快速的算法
M
>
>
n
=
M
/
2
n
M >> n = M / 2^n
M>>n=M/2n