C++中的位运算符:与、或、异或详解

在 C++ 中,位运算符用于对整数类型的二进制位进行操作,包括与(&)、或(|)、异或(^) 等。它们直接作用于内存中的二进制位,运算效率极高,常用于底层编程(如驱动开发、嵌入式)、数据压缩、加密等场景。以下是详细解析:

一、基础概念

位运算的操作对象是整数的二进制补码形式 (C++ 中整数默认以补码存储),运算时按"位对齐",逐位进行操作(不影响其他位)。 例如,对整数 ​​a = 6​​(二进制 ​​0110​​)和 ​​b = 11​​(二进制 ​​1011​​)进行位运算时,对齐方式如下:

代码语言:javascript

AI代码解释

复制代码
a: 0110
  b: 1011
---------- (按位操作)
结果: xxxx
二、与运算符(&)

运算规则 :两位都为 ​​1​​ 时,结果为 ​​1​​;否则为 ​​0​​(同真为真)。 ​​1 & 1 = 1​​,​​1 & 0 = 0​​,​​0 & 1 = 0​​,​​0 & 0 = 0​​。

示例:

代码语言:javascript

AI代码解释

复制代码
int a = 6;    // 二进制:0110
int b = 11;   // 二进制:1011
int c = a & b; // 0110 & 1011 = 0010(十进制 2)
常用场景:
  1. 清零特定位 :将某几位与 0 相与,可将其清零(其他位与 1 相与保持不变)。 例如,清零 a 的低 2 位:a & 0xfffffffc(假设 32 位整数,0xfffffffc 二进制为 11111111...1100)。
  2. 判断奇偶 :二进制末位为 1 是奇数,为 0 是偶数。通过 a & 1 结果判断: a & 1 == 1 → 奇数;a & 1 == 0 → 偶数。
  3. 提取特定位 :与一个"掩码"(特定位为 1,其余为 0)相与,可提取对应位的值。 例如,提取 a 的第 3 位(从 0 开始计数):(a & (1 << 3)) != 0
三、或运算符(|)

运算规则 :两位中至少有一个为 ​​1​​ 时,结果为 ​​1​​;否则为 ​​0​​(一真即真)。 ​​1 | 1 = 1​​,​​1 | 0 = 1​​,​​0 | 1 = 1​​,​​0 | 0 = 0​​。

示例:

代码语言:javascript

AI代码解释

复制代码
int a = 6;    // 0110
int b = 11;   // 1011
int c = a | b; // 0110 | 1011 = 1111(十进制 15)
常用场景:
  1. 设置特定位为 1 :将某几位与 1 相或,可强制其为 1(其他位与 0 相或保持不变)。 例如,将 a 的低 2 位设为 1a | 0x30x3 二进制为 11)。
  2. 合并位信息 :将多个变量的不同位组合到一个整数中。 例如,将 x 的低 4 位和 y 的高 4 位合并:(y & 0xf0) | (x & 0x0f)
四、异或运算符(^)

运算规则 :两位不同时结果为 ​​1​​,相同时为 ​​0​​(异为真)。 ​​1 ^ 1 = 0​​,​​1 ^ 0 = 1​​,​​0 ^ 1 = 1​​,​​0 ^ 0 = 0​​。

示例:

代码语言:javascript

AI代码解释

复制代码
int a = 6;    // 0110
int b = 11;   // 1011
int c = a ^ b; // 0110 ^ 1011 = 1101(十进制 13)
常用场景:
  1. 翻转特定位 :将某几位与 1 异或,可翻转其值(0→11→0);与 0 异或保持不变。 例如,翻转 a 的低 3 位:a ^ 0x70x7 二进制为 111)。
  2. 交换两个数(无需临时变量)

代码语言:javascript

AI代码解释

复制代码
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)
  1. 消除重复值 :连续异或同一个数两次,结果不变(a ^ a = 00 ^ a = a)。 例如,在数组中找到唯一不重复的元素(其他元素出现两次):

代码语言:javascript

AI代码解释

复制代码
int findUnique(int arr[], int n) {
    int res = 0;
    for (int i = 0; i < n; i++) res ^= arr[i];
    return res; // 最终 res 为唯一不重复的元素
}
五、注意事项
  1. 操作数类型 :位运算符仅适用于整数类型(​int​​long​​char​ 等),不可用于浮点数。
  2. 符号位处理 :对于有符号整数(如 ​int​),符号位(最高位)会参与运算,可能导致意想不到的结果(建议对无符号整数 ​unsigned​ 使用位运算)。
  3. 优先级 :位运算符优先级低于算术运算符和关系运算符,建议使用括号明确运算顺序。例如 ​(a & b) == c​ 而非 ​a & b == c​

通过位运算符,可高效处理二进制级别的操作,是 C++ 底层编程的重要工具。掌握其规则和场景,能显著提升代码性能和灵活性。

相关推荐
介一安全2 小时前
从 0 到 1 玩转 2025 最新 WebGoat 靶场:环境搭建 + 全关卡漏洞解析(超级详细)
java·web安全·网络安全·靶场
web安全工具库2 小时前
Linux进程的:深入理解子进程回收与僵尸进程
java·linux·数据库
沐浴露z2 小时前
详解【限流算法】:令牌桶、漏桶、计算器算法及Java实现
java·算法·限流算法
王哈哈^_^2 小时前
【完整源码+数据集】草莓数据集,yolov8草莓成熟度检测数据集 3207 张,草莓成熟度数据集,目标检测草莓识别算法系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
chxii2 小时前
Spring Boot 响应给客户端的常见返回类型
java·spring boot·后端
老友@3 小时前
一次由 PageHelper 分页污染引发的 Bug 排查实录
java·数据库·bug·mybatis·pagehelper·分页污染
AI分享猿3 小时前
小白学规则编写:雷池 WAF 配置教程,用 Nginx 护住 WordPress 博客
java·网络·nginx
sp423 小时前
漫谈 Java 轻量级的模板技术:从字符串替换到复杂模板
java·后端
油泼辣子多加3 小时前
【实战】自然语言处理--长文本分类(3)HAN算法
算法·自然语言处理·分类