位运算

程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作。

位运算符

符号作用
&按位与
|按位或
~按位非
^按位异或
<<左位移运算符
>>右位移运算符
<<<无符号右移运算符

位运算符中,除 ~ 以外,其余均为二元运算符。操作数只能为整型和字符型数据。

详解

按位与(&)

例如: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。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待