C/C++中的按位运算
也许你偶然发现了一行令人困惑和恐惧的代码:
((value << 2) & 32)
你不知道这是什么,在网上搜索了好久才找到答案,然后发现了所谓的“位运算”。在这篇文章中,我们将讲解 C 和 C++ 中所有可能的位运算。
位运算是对位进行操作的运算。如果某个位为 1,则表示“真”或“开”。如果为 0,则表示“假”或“关”。与算术运算符一样,位运算符在计算完成后会给出结果。
和
对于一位值,如果两位都处于“开”状态,则 AND 运算符的结果为“开”。否则,结果为“关”。
1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0
对于字节,它会检查每个位并单独应用 AND 运算。
10000000 & 01111111 == 00000000
11000000 & 11100011 == 11000000
10100110 & 10000111 == 10000110
10101010 & 11011011 == 10001010
或者
在 C 和 C++中用 表示|
,如果任何位处于“开”状态,则此操作产生“开”状态。
1 | 1 == 1
1 | 0 == 1
0 | 1 == 1
0 | 0 == 0
就像 AND 运算符一样,对多位值也可以执行相同的操作。
异或
用^
“排他或”表示。当只有一个位为真时,结果为“开”。
1 ^ 1 == 0
1 ^ 0 == 1
0 ^ 1 == 1
0 ^ 0 == 0
对字节等多位值进行的操作是在位级别完成的,就像 AND 和 OR 一样。
阴性
对位的状态取反。符号~
表示此操作。
~1 == 0
~0 == 1
与多位值相同。
位掩码
这不是一个操作,而是程序员在处理按位运算时有时会用到的东西。你可以把位掩码想象成一个过滤器,用来从多位值中提取位。
假设我们有一个字节10100111
,并且想要获取它的前两位。我们可以使用位掩码来实现这个目标。位掩码中的 0 表示忽略,1 表示提取。在我们的例子中,位掩码如下所示:000000011
。要应用位掩码,我们使用 AND 运算符。
10100111 & 00000011 == 00000011
移位运算符
您之前已经看到过<<
和>>
。它们分别表示“向左移动”和“向右移动”。
左侧的操作数是被移位的值,而右侧的操作数是移位量。
与我们研究过的其他运算符不同,这些运算符仅适用于字节等多位值。
为了演示的目的,我们将使用这个值11001011
来演示。
这些运算符将每位按其所用移位运算符类型指定的方向移动一定量。完全移出字节的位将被丢弃,并在另一侧填充零。
11001011 << 1 == 10010110
11001011 >> 2 == 00110010
这是我在主要使用 SDL2 帖子发布后决定写的一篇简短文章。
编辑:
感谢@ccmg 的更正。
鏂囩珷鏉ユ簮锛�https://dev.to/noah11012/bitwise-operations-in-cc-3j3k