C++同时具有高级语言与汇编语言的优点,C++提供了6个位运算符,可以对整数进行位操作,位操作就是对数据按二进制位进行操作。
位运算符 | 优先级 |
---|---|
按位与(&) | 10 |
按位或 () | 12 |
按位异或(^) | 11 |
按位取反(~) | 2 |
左移(<<) 右移(>>) | 7 |
运算符优先级大小:取反(~)> 左移(<<)右移(>>)> 与(&)> 异或(^)> 或(|)
课本中的习题:
①.若a=1,b=2,c=3,d=-8下列各式的结果是什么?
(1) a|b-c
(2) a^b&-c
(3) a&b|c
(4) a|b&c
(5) d>>2
解析:
a: 0000 0001
b: 0000 0010
c: 0000 0011
Tip: 负数在计算机中是以补码的形式存储的,负数转换成二进制可以通过其绝对值的原码各位取反然后加1。
例如求-127的补码:
127的原码: 01111111
-127的补码: 10000001
(1)、
先计算b-c = -1, 1的原码是0000 0001 各位取反然后加1得到1111 1111 即为-1,
所以计算 1|-1 :
1: 0000 0001
-1:(|) 1111 1111
——————————————————————————————
1 | -1: 1111 1111
结果:-1
(2)、
c = -3, -3: 1111 1101
因为优先级&>^,所以先计算b&-c
2: 0000 0010
-3:(&) 1111 1101
————————————————————————————
2&-3: 0000 0000
求出:0
再计算1^0
1: 0000 0001
0:(^) 0000 0000
———————————————————————————
1^0: 0000 0001
结果:1
(3)、
因为优先级&>|,所以先计算a&b
1: 0000 0001
2:(&) 0000 0010
————————————————————————————
1&2: 0000 0000
求出:0
再计算0|c
0: 0000 0000
3:(|) 0000 0011
————————————————————————————
0|3: 0000 0011
结果:3
(4)、
因为优先级&>|,所以先计算b&c
2: 0000 0010
3:(&) 0000 0011
——————————————————————————————
2&3: 0000 0010
求出:2
再计算1|2
1: 0000 0001
2:(|) 0000 0010
——————————————————————————————
1|2: 0000 0011
结果:3
(5)、
左移是按照指定的位数将一个数的二进制值向左移位。左移后,低位补0,移除的高位舍弃,如果该数是负数的话,则补1。
右移是按照指定的位数将一个数的二进制值向右移位。右移后,高位补0,移除的低位舍弃,如果该数是负数的话,则补1。
d: 1111 1000
d>>2 :"1""1"11 1110 (前两位补"1" ,后两位"0"给舍弃)
结果:-2