当前位置: 首页 > news >正文

C++位运算

 C++ 位运算

在C++中,位运算是直接对二进制位进行操作的运算,其操作数通常是整型或枚举类型。位运算速度极快,常用于底层编程、数据压缩、加密算法和性能优化等场景。以下是对C++位运算的详细总结:

基础位运算符

  1. 按位与(&)
    两个对应位都为1时,结果位为1,否则为0。

  2. 按位或(|)
    两个对应位中有一个为1,结果位为1;只有当两个位都为0时,结果位为0。

  3. 按位异或(^)
    两个对应位不同时,结果位为1;相同时,结果位为0。

  4. 按位取反(~)
    对操作数的每一位取反(1变0,0变1)。

  5. 左移(<<)
    将左操作数的二进制位向左移动右操作数指定的位数,右边空出的位用0填充。

  6. 右移(>>)
    将左操作数的二进制位向右移动右操作数指定的位数。对于无符号数,左边空出的位用0填充;对于有符号数,左边空出的位用符号位填充(算术右移)。

常见应用场景

访问和修改特定的位

  • 判断某位的值x & (1 << n) 可判断整数x的第n位是否为1。
  • 设置某位的值x | (1 << n) 将整数x的第n位设置为1。
  • 清除某位的值x & ~(1 << n) 将整数x的第n位清除为0。
  • 切换某位的值x ^ (1 << n) 对整数x的第n位进行取反。

掩码操作

  • 掩码是用于选择特定位的模式,例如 0xFF 是低8位全为1的掩码。
  • 提取特定的位x & mask
  • 设置特定的位x | mask

交换两个变量的值

不使用临时变量交换两个变量的值:

a ^= b;
b ^= a;
a ^= b;

高效计算

  • 乘以 / 除以 2 的幂x << n 等价于 x * (2^n)x >> n 等价于 x / (2^n)
  • 判断奇偶性x & 1 结果为 1 时 x 是奇数,结果为 0 时 x 是偶数。
  • 计算绝对值
    int abs(int x) {int mask = x >> 31;return (x ^ mask) - mask;
    }
    

枚举标志

使用位运算组合枚举值:

enum Flags {READ = 1,    // 0001WRITE = 2,   // 0010EXECUTE = 4  // 0100
};
int permissions = READ | WRITE; // 0011

高级技巧

计算汉明权重(二进制中 1 的个数)

int countBits(int x) {int count = 0;while (x) {count += x & 1;x >>= 1;}return count;
}// 更高效的方法
int countBits(int x) {int count = 0;while (x) {x &= x - 1; // 清除最低位的1count++;}return count;
}

判断是否是 2 的幂

若 x & (x - 1) == 0,则 x 是 2 的幂。

查找最低位的 1

x & -x 返回最低位 1 所在位置对应的数值。

位操作实现加法

int add(int a, int b) {while (b != 0) {int carry = a & b;a = a ^ b;b = carry << 1;}return a;
}

注意事项

  1. 优先级问题
    位运算符的优先级低于算术运算符,使用时需注意添加括号,例如 (x & 0xFF)

  2. 有符号数右移
    有符号数右移执行算术右移(保留符号位),可能导致意外结果。

  3. 性能考量
    现代编译器通常会优化简单的位运算,在性能关键代码中优先使用位运算而非函数调用。

  4. 可移植性
    不同平台对某些位操作的实现可能不同,例如移位位数超过类型宽度的行为是未定义的。

示例代码

以下是一个完整示例,展示位运算的常见用法:

#include <iostream>
using namespace std;int main() {// 基础操作int a = 5;  // 二进制: 0101int b = 3;  // 二进制: 0011cout << "a & b = " << (a & b) << endl;  // 输出 1 (0001)cout << "a | b = " << (a | b) << endl;  // 输出 7 (0111)cout << "a ^ b = " << (a ^ b) << endl;  // 输出 6 (0110)cout << "~a = " << (~a) << endl;        // 输出 -6 (二进制补码)cout << "a << 1 = " << (a << 1) << endl; // 输出 10 (1010)cout << "a >> 1 = " << (a >> 1) << endl; // 输出 2 (0010)// 位操作技巧int x = 13;  // 二进制: 1101cout << "第2位是否为1: " << ((x & (1 << 2)) ? "是" : "否") << endl;cout << "设置第1位为1: " << (x | (1 << 1)) << endl;cout << "清除第3位: " << (x & ~(1 << 3)) << endl;cout << "切换第0位: " << (x ^ (1 << 0)) << endl;return 0;
}

位运算在 C++ 中应用广泛,但需深入理解二进制表示和补码运算才能正确使用。在底层编程或性能优化时,位运算是强大的工具。

http://www.sczhlp.com/news/74907/

相关文章:

  • 怀化建设公司网站广州建网站价格
  • 口碑营销网站泗洪做网站
  • 免费分类信息网站源码婚恋网站排名前十名
  • 电子商务网站的基础建设移动端 pc网站开发
  • 北京网站优化诊断wordpress 会员分销
  • 网站开发app开发培训一级造价工程师报名时间2023年
  • 网站建设情况wordpress网站安全
  • 搭建网站是要什么建设网站哪专业
  • 个人建设网站流程图门户网站的意义
  • 做网站不推广管用吗公司经营范围参考
  • 好像不怎么能看进去框架
  • 做游戏开箱网站的法律风险最近新闻有哪些
  • 电商哪个平台好衡阳seo优化推荐
  • 福建泉州做网站公司哪家好购物网站开发需求文档
  • 重庆网站设计公司网站制作网站和推广在一家做的好处
  • 做外国购物网站需要交税吗会议网站建设
  • 建设银行官方网站链接软件工程的定义
  • 网站建设 泰安南京网站优化技术
  • 在哪里可以自己建网站米枫网站怎么做分页
  • 佛山网站搭建费用网站如何建设成直播间
  • vscode终端输出乱码
  • 中原教师
  • 天津营销类网站设计外贸平台推广方式
  • 网站的站外优化wordpress 采集站
  • 网站建设怎么开发客户个人网站数据库大小
  • 安丘营销型网站建设南京网站制作费用
  • 网站托管找网站开发路径
  • 珠海网站设计培训公司文件页面设计
  • 信阳做网站的江苏电力建设网站
  • 做移动端网站软件下载怎么设置网站关键词