程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作。
位运算符
符号 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
~ | 按位非 |
^ | 按位异或 |
<< | 左位移运算符 |
>> | 右位移运算符 |
<<< | 无符号右移运算符 |
位运算符中,除 ~ 以外,其余均为二元运算符。操作数只能为整型和字符型数据。
详解
按位与(&)
例如:6的二进制是 110
,11的二进制是 1011
,那么6 & 11的结果二进制 0010
就是2
6 & 11
0110
1011
----
0010
0010 --> 2
只有两个操作数对应位同为1时,结果为1,其余全为0
按位或(|)
例如:5的二进制是 0101
,9的二进制是 1001
,那么5 | 9的结果二进制 1101
就是13
5 | 9
0101
1001
-----
1101
1101 --> 13
只有两个操作数对应位同为0时,结果为0,其余全为1
按位非(~)
~ 168
10101000
--------
01010111
按位异或(^)
例如:18的二进制是 10010
,11的二进制是 01011
,那么18 ^ 11的结果二进制 11001
就是25
18 ^ 11
10010
01011
-----
11001
11001 --> 25
两个操作数对应位相同为0,不同为1
左位移运算符(<<)
例如:152 << 2结果为608
152 << 2
10011000
1001100000
----------
1001100000
1001100000 --> 608
符号位不变,低位补0
右位移运算符(>>)
例如:6 >> 2结果为1
6 >> 2
110
00110
-----
001
001 --> 1
低位溢出,符号位不变,并用符号位补溢出的高位
无符号右移运算符(>>>)
例如:-1 >>> 1结果为2147483647
-1 >>> 1
十进制
-1
二进制补码
11111111111111111111111111111111
高位补0,右移一位
011111111111111111111111111111111
---------------------------------
01111111111111111111111111111111
01111111111111111111111111111111 --> 2147483647
低位溢出,高位补0。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待