C++中的位运算符:与、或、异或详解
在 C++ 中,位运算符用于对整数类型的二进制位进行操作,包括等。它们直接作用于内存中的二进制位,运算效率极高,常用于底层编程(如驱动开发、嵌入式)、数据压缩、加密等场景。
在 C++ 中,位运算符用于对整数类型的二进制位进行操作,包括与(&)、或(|)、异或(^) 等。它们直接作用于内存中的二进制位,运算效率极高,常用于底层编程(如驱动开发、嵌入式)、数据压缩、加密等场景。以下是详细解析:
一、基础概念
位运算的操作对象是整数的二进制补码形式(C++ 中整数默认以补码存储),运算时按“位对齐”,逐位进行操作(不影响其他位)。
例如,对整数 a = 6(二进制 0110)和 b = 11(二进制 1011)进行位运算时,对齐方式如下:
a: 0110
b: 1011
---------- (按位操作)
结果: xxxx
二、与运算符(&)
运算规则:两位都为 1 时,结果为 1;否则为 0(同真为真)。1 & 1 = 1,1 & 0 = 0,0 & 1 = 0,0 & 0 = 0。
示例:
int a = 6; // 二进制:0110
int b = 11; // 二进制:1011
int c = a & b; // 0110 & 1011 = 0010(十进制 2)
常用场景:
-
清零特定位:将某几位与
0相与,可将其清零(其他位与1相与保持不变)。
例如,清零a的低 2 位:a & 0xfffffffc(假设 32 位整数,0xfffffffc二进制为11111111...1100)。 -
判断奇偶:二进制末位为
1是奇数,为0是偶数。通过a & 1结果判断:a & 1 == 1→ 奇数;a & 1 == 0→ 偶数。 -
提取特定位:与一个“掩码”(特定位为
1,其余为0)相与,可提取对应位的值。
例如,提取a的第 3 位(从 0 开始计数):(a & (1 << 3)) != 0。
三、或运算符(|)
运算规则:两位中至少有一个为 1 时,结果为 1;否则为 0(一真即真)。1 | 1 = 1,1 | 0 = 1,0 | 1 = 1,0 | 0 = 0。
示例:
int a = 6; // 0110
int b = 11; // 1011
int c = a | b; // 0110 | 1011 = 1111(十进制 15)
常用场景:
-
设置特定位为 1:将某几位与
1相或,可强制其为1(其他位与0相或保持不变)。
例如,将a的低 2 位设为1:a | 0x3(0x3二进制为11)。 -
合并位信息:将多个变量的不同位组合到一个整数中。
例如,将x的低 4 位和y的高 4 位合并:(y & 0xf0) | (x & 0x0f)。
四、异或运算符(^)
运算规则:两位不同时结果为 1,相同时为 0(异为真)。1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0。
示例:
int a = 6; // 0110
int b = 11; // 1011
int c = a ^ b; // 0110 ^ 1011 = 1101(十进制 13)
常用场景:
-
翻转特定位:将某几位与
1异或,可翻转其值(0→1或1→0);与0异或保持不变。
例如,翻转a的低 3 位:a ^ 0x7(0x7二进制为111)。 -
交换两个数(无需临时变量):
int x = 3, y = 5; x = x ^ y; // x 现在是 x^y y = x ^ y; // y = (x^y)^y = x(y 被赋值为原来的 x) x = x ^ y; // x = (x^y)^x = y(x 被赋值为原来的 y) -
消除重复值:连续异或同一个数两次,结果不变(
a ^ a = 0,0 ^ a = a)。
例如,在数组中找到唯一不重复的元素(其他元素出现两次):int findUnique(int arr[], int n) { int res = 0; for (int i = 0; i < n; i++) res ^= arr[i]; return res; // 最终 res 为唯一不重复的元素 }
五、注意事项
- 操作数类型:位运算符仅适用于整数类型(
int、long、char等),不可用于浮点数。 - 符号位处理:对于有符号整数(如
int),符号位(最高位)会参与运算,可能导致意想不到的结果(建议对无符号整数unsigned使用位运算)。 - 优先级:位运算符优先级低于算术运算符和关系运算符,建议使用括号明确运算顺序。例如
(a & b) == c而非a & b == c。
通过位运算符,可高效处理二进制级别的操作,是 C++ 底层编程的重要工具。掌握其规则和场景,能显著提升代码性能和灵活性。在 C++ 中,位运算符用于对整数类型的二进制位进行操作,包括与(&)、或(|)、异或(^) 等。它们直接作用于内存中的二进制位,运算效率极高,常用于底层编程(如驱动开发、嵌入式)、数据压缩、加密等场景。以下是详细解析:
一、基础概念
位运算的操作对象是整数的二进制补码形式(C++ 中整数默认以补码存储),运算时按“位对齐”,逐位进行操作(不影响其他位)。
例如,对整数 a = 6(二进制 0110)和 b = 11(二进制 1011)进行位运算时,对齐方式如下:
a: 0110
b: 1011
---------- (按位操作)
结果: xxxx
二、与运算符(&)
运算规则:两位都为 1 时,结果为 1;否则为 0(同真为真)。1 & 1 = 1,1 & 0 = 0,0 & 1 = 0,0 & 0 = 0。
示例:
int a = 6; // 二进制:0110
int b = 11; // 二进制:1011
int c = a & b; // 0110 & 1011 = 0010(十进制 2)
常用场景:
-
清零特定位:将某几位与
0相与,可将其清零(其他位与1相与保持不变)。
例如,清零a的低 2 位:a & 0xfffffffc(假设 32 位整数,0xfffffffc二进制为11111111...1100)。 -
判断奇偶:二进制末位为
1是奇数,为0是偶数。通过a & 1结果判断:a & 1 == 1→ 奇数;a & 1 == 0→ 偶数。 -
提取特定位:与一个“掩码”(特定位为
1,其余为0)相与,可提取对应位的值。
例如,提取a的第 3 位(从 0 开始计数):(a & (1 << 3)) != 0。
三、或运算符(|)
运算规则:两位中至少有一个为 1 时,结果为 1;否则为 0(一真即真)。1 | 1 = 1,1 | 0 = 1,0 | 1 = 1,0 | 0 = 0。
示例:
int a = 6; // 0110
int b = 11; // 1011
int c = a | b; // 0110 | 1011 = 1111(十进制 15)
常用场景:
-
设置特定位为 1:将某几位与
1相或,可强制其为1(其他位与0相或保持不变)。
例如,将a的低 2 位设为1:a | 0x3(0x3二进制为11)。 -
合并位信息:将多个变量的不同位组合到一个整数中。
例如,将x的低 4 位和y的高 4 位合并:(y & 0xf0) | (x & 0x0f)。
四、异或运算符(^)
运算规则:两位不同时结果为 1,相同时为 0(异为真)。1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0。
示例:
int a = 6; // 0110
int b = 11; // 1011
int c = a ^ b; // 0110 ^ 1011 = 1101(十进制 13)
常用场景:
-
翻转特定位:将某几位与
1异或,可翻转其值(0→1或1→0);与0异或保持不变。
例如,翻转a的低 3 位:a ^ 0x7(0x7二进制为111)。 -
交换两个数(无需临时变量):
int x = 3, y = 5; x = x ^ y; // x 现在是 x^y y = x ^ y; // y = (x^y)^y = x(y 被赋值为原来的 x) x = x ^ y; // x = (x^y)^x = y(x 被赋值为原来的 y) -
消除重复值:连续异或同一个数两次,结果不变(
a ^ a = 0,0 ^ a = a)。
例如,在数组中找到唯一不重复的元素(其他元素出现两次):int findUnique(int arr[], int n) { int res = 0; for (int i = 0; i < n; i++) res ^= arr[i]; return res; // 最终 res 为唯一不重复的元素 }
五、注意事项
- 操作数类型:位运算符仅适用于整数类型(
int、long、char等),不可用于浮点数。 - 符号位处理:对于有符号整数(如
int),符号位(最高位)会参与运算,可能导致意想不到的结果(建议对无符号整数unsigned使用位运算)。 - 优先级:位运算符优先级低于算术运算符和关系运算符,建议使用括号明确运算顺序。例如
(a & b) == c而非a & b == c。
通过位运算符,可高效处理二进制级别的操作,是 C++ 底层编程的重要工具。掌握其规则和场景,能显著提升代码性能和灵活性。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)