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

2025-12-12 0 378

在 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)
常用场景:
  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​​。

示例:
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​​。

示例:
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. 交换两个数(无需临时变量)
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)。
    例如,在数组中找到唯一不重复的元素(其他元素出现两次):
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++ 底层编程的重要工具。掌握其规则和场景,能显著提升代码性能和灵活性。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 C++中的位运算符:与、或、异或详解 https://www.zuozi.net/35687.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务