位运算符:用于二进制运算,位运算符的速度最快
左移 | 右移 | 无符号移 | 与 | 或 | 异或 | 取反 |
---|---|---|---|---|---|---|
<< | >> | >>> | & | | | ^ | ~ |
以左移位运算<<为例,计算3<<2
- 先从十进制int类型(32位)转换为二进制,
3(10) = 0000-0000 0000-0000 0000-0000 0000-0011(2) - 将整个二进制向左移两位,
位移后,红线后的0为第一位,此时一共30位,所以在末尾不上两个0,补齐后二进制表现如下,
- 此时0000-0000 0000-0000 0000-0000 0000-1100(2) = 12(10)
因此 3<<2 = 12
二进制向左移,其实就相当于所有数字移动到前一个高位上,位移几位,就是乘以2的几次幂。
位运算算式 | 对应的乘法表现形式 |
---|---|
3 << 1 = 6 | 3*21 |
3 << 2 = 12 | 3*22 |
3 << 3 = 24 | 3*23 |
右移同理,相当于除以2的几次幂。
右移时,最前面补的数按最高位来确定,即正数补0,负数补1
0000…0110 = 6
1111…1010 = -6
当使用无符号位移>>>符,无论正负数,前面都以0补齐,所以无符号位移后的数一定是非负数。
以&为例计算6&3
- 将6和3转换为二进制,
6(10) = 110(2)
3(10) = 011(2) - 每一位二进制数都&计算
将0看作false,1看作true,false&true = false ,最右为0,依次计算,得结果010,转换为十进制为2。
因此6 & 3 = 2
或|和异或^同理
一个数异或同一个数两次,结果还是原来的数
例如,
7 ^ 4 = 3
7 ^ 4 ^ 4 = 7
以~6为例计算
-
将6转换为二进制,
6(10) = 0000…0110 (2) -
取反,将0变成1,1变成0,再转换为十进制
1111…1001 (2) = -7(10)
因此~6 = -7可以利用取反后+1,来实现正数转负数的操作
例如,~6+1 = -6