位运算符是非常底层的运算,以速度极快著称。位运算符有:&
、|
、^
、~
、>>
、<<
、>>>
。部分位运算符也可作逻辑运算符,主要通过运算符左右两侧连接的操作数类型区分。如果左右连接的是布尔类型,则作逻辑运算符,否则作位运算符。
左移 <<
左移运算符不区分有无符号,因为==符号位不参与移位==。高位舍弃,低位补0。
以 3<<2=12
为例:
3在底层的存储形式为 00000000 00000000 00000000 00000011
,符号位不动,其余位左移2位,得到 00000000 00000000 00000000 00001100
,十进制形式即为12。
以 -3<<2=-12
为例:
-3在底层的存储形式为 11111111 11111111 11111111 11111101
,符号位不动,其余位左移2位,得到 11111111 11111111 11111111 11110100
,十进制形式即为-12。
我们不难发现,一个数每左移1位,其实就相当于乘以2一次。
Question:4乘以8最快的方式是什么?
Answer:4<<3
有符号右移 >>
有符号右移的低位舍弃,==符号位不参与移位==,而高位补全的是符号位。根据左移的规律推测,右移相当于除以2。
以 6>>2=1
为例:
6在底层的存储形式为 00000000 00000000 00000000 00000110
,右移2位,低位的 10
舍弃,高位补全符号位0,所以得到 00000000 00000000 00000000 00000001
,十进制形式为1。
以 -6>>2=-2
为例:
-6在底层的存储形式为 11111111 11111111 11111111 11111010
,右移2位,低位的 10
舍弃,高位补全符号位1,所以得到 11111111 11111111 11111111 11111110
,十进制形式为-2。
无符号右移 >>>
无符号右移的低位舍弃,==符号位参与移位==,而高位补全的是0。
以 6>>>2=1
为例:
6在底层的存储形式为 00000000 00000000 00000000 00000110
,右移2位,低位的 10
舍弃,高位补全0,所以得到 00000000 00000000 00000000 00000001
,十进制形式为1。
以 -6>>>2
为例:
-6在底层的存储形式为 11111111 11111111 11111111 11111010
,右移2位,低位的 10
舍弃,高位补全0,所以得到 00111111 11111111 11111111 11111110
,十进制形式为1073741822。
按位与 &
将参加运算的两个数据,按二进制位进行与运算。两个都是1则为1,其余情况都是0。
以 6&3=2
为例:
按位或 |
将参加运算的两个数据,按二进制位进行或运算。两个中有1则为1,两个全为0则是0。
以 6|3=7
为例:
异或 ^
将参加运算的两个数据,按二进制位进行异或运算。相同为0,不同为1。
以 6^3=5
为例:
按位取反 ~
将数据按二进制位进行取反运算。0变成1,1变成0。
以 ~6=-7
为例:
6的二进制形式为 00000000 00000000 00000000 00000110
,取反为11111111 11111111 11111111 11111001
,十进制形式为-7。