美文网首页
C++程序设计学习笔记:1 从C走进C++ 位运算

C++程序设计学习笔记:1 从C走进C++ 位运算

作者: louyang | 来源:发表于2017-11-01 18:07 被阅读40次

当我们想感知或改变某一个变量中的某一比特时,没有位运算,是很难实现的。

C/C++ 语言提供了六种位运算符:

&  按位与(双目)
|   按位或(双目)
^  按位异或(双目)
~  按位取反(单目)
<<  左移(双目)
>>  右移(双目)

1 按位与 "&"

多用于将某些比特位清零,而其他比特位保持不变。也可以用于获取变量中的某一位。

例如:将 int 型变量 n 的低 8 位保持不变,其余位清零。

n = n & 0xffffff00;

或

n &= 0xffffff00;

再例如:判断int型变量 n 的第 7 位(从右往左)是否为 1?

if ((n & 0x80) == 0x80) { ... }

2 按位或 "|"

常用于将变量中的某比特位设置为1,且保留其他比特位不变。

例如:将 int 型变量n的低8位全置为1,其余位保持不变。

n = n | 0xff;

3 按位异或 "^"

异或表示,异则为1,同则为0。
常用于将变量中的某些比特位取反,而保留其他比特位不变。

例如:将 int 型变量n的低8位取反,其余为保持不变。

n = n ^ 0xff;

异或运算有一个特点:

如果 a ^ b = c, 那么就有 c ^ b = a 以及 c ^ a = b (穷举法可证)

异或运算还有一个有趣的事情:不用临时变量,就可以交换两个变量的值。

int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;
穷举法可证

4 按位非 "~"

"~"是个单目运算符,用于按比特位取反。例如:

char b = 0xF0;
a = ~b;

则a = 0x0F。

5 左移运算符 "<<"

高位丢弃,低位补0。

a = 9 << 4; // a = 144

左移1位,相当于乘2。左移比乘法运算快的多。

6 右移运算符 ">>"

低位丢弃,高位补符号位。

a = 9 >> 1; // a = 4

右移1位,相当于除2。除不尽则向小里取整。右移比除法运算快的多。

课程录像

北京大学郭炜/刘家瑛老师,C++程序设计课程录像

相关文章

网友评论

      本文标题:C++程序设计学习笔记:1 从C走进C++ 位运算

      本文链接:https://www.haomeiwen.com/subject/fgjhpxtx.html