C++位运算符的用法(图文并茂,附带实例)
位运算符可对其二进制位进行操作,包括位与“&”、位或“|”、位异或“^”和取反“~”这 4 种运算,如下表所示。
C++ 中,位运算的对象只能是整型或字符型数据。
在 4 个位运算符中,~ 的优先级是最高的。在 3 个双目运算符中,“&”的优先级最高,“^”次之,“|” 最低。
例如,12 和 8 位与运算后得到的结果是 8:
例如,4 和 8位或运算后得到的结果是 12:
例如,31 和 22 位异或运算后得到的结果是 9:
例如,~9 可以转换为如下的运算:
例如,~-9 可以转换为如下的运算:
运算符 | 功能 | 目数 | 用法 |
---|---|---|---|
& | 位与 | 双目 | expr1 & expr2 |
| | 位或 | 双目 | expr1 | expr2 |
^ | 位异或 | 双目 | expr1 ^ expr2 |
~ | 取反 | 单目 | ~expr |
C++ 中,位运算的对象只能是整型或字符型数据。
在 4 个位运算符中,~ 的优先级是最高的。在 3 个双目运算符中,“&”的优先级最高,“^”次之,“|” 最低。
C++位运算符的运算规则
1) 位与运算
位与运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求与。若两个操作数对象同一位都为 1,则结果对应位为 1,否则结果对应位为 0。例如,12 和 8 位与运算后得到的结果是 8:

#include <iostream> using namespace std; int main(){ cout << (12&8) << endl; return 0; }运行结果为:
8
2) 位或运算
位或运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求或。若两个操作数对象同一位都为 0,则结果对应位为 0,否则结果对应位为 1。例如,4 和 8位或运算后得到的结果是 12:

#include <iostream> using namespace std; int main(){ cout << (4|8) << endl; return 0; }运行结果为:
12
3) 位异或运算
位异或运算中,需将操作数转换成二进制表示方式,从低位(最右边)到高位对齐,逐位求异或。若两个操作数对象同一位不相同,则结果对应位为 1,否则结果中对应位为 0。例如,31 和 22 位异或运算后得到的结果是 9:

#include <iostream> using namespace std; int main(){ int n = 31^22; cout << n << endl; return 0; }运行结果为:
9
4) 取反运算
取反运算符 ~ 为单目运算符,右结合性,作用是对参与运算的二进制位取反。例如 ~1 为 0,~0 为 1,这和逻辑运算中的 ! 非常类似。例如,~9 可以转换为如下的运算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储) ----------------------------------------------------------------------------------- 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)所以 ~9 的结果为 -10。
例如,~-9 可以转换为如下的运算:
~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储) ----------------------------------------------------------------------------------- 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (8 在内存中的存储)所以 ~-9 的结果为 8。
#include <iostream> using namespace std; int main(){ cout << ~9 << endl; return 0; }运行结果为:
-10