位运算是直接操作整数二进制表示的底层操作,常用于系统编程、算法优化等;与运算(&)逐位比较,同为1才得1,用于掩码提取(如x & 0xF取低4位)、判断奇偶(x & 1)或清零特定位(如x & ~(1

位运算是直接操作整数二进制表示的底层操作,在C++中高效且常用于系统编程、算法优化、状态压缩、加密、硬件交互等场景。它不经过高级抽象,直击内存中的比特(bit),因此理解清楚每种运算的逻辑和边界行为至关重要。
与运算(&):提取特定位或清零
按位与是逐位比较两个操作数,仅当两对应位都为1时结果才为1,否则为0。最常用在“掩码提取”和“清零特定位置”。
- 提取某几位:比如想获取一个整数 x 的低4位,可写 x & 0xF(0xF = 0b1111),因为其他高位与0相与全为0,只留下低4位原值。
- 判断奇偶:x & 1 等价于 x % 2,因为最低位为1则为奇数,为0则为偶数。
- 清零某些位:如需把 int x 的第3位(从0开始计)强制置0,可用 x & ~(1 —— 先构造掩码 1
或运算(|):设置特定位
按位或是逐位比较,只要有一个为1结果就为1。主要用途是“置位”——把某些位强制设为1,而不影响其他位。
-
开启某个标志位:比如用一个整数 flags 表示多个开关状态,第2位代表“是否启用日志”,那么开启它就是 flags |= (1 ,等价于 flags = flags | (1
- 合并多个标志:若 LOG_ON = 1flags = LOG_ON | DEBUG_ON | ERROR_ON
,得到 0b111。
异或运算(^):翻转、交换、判等
按位异或:相同为0,不同为1。它有三大关键性质:自反性(a ^ a = 0)、恒等性(a ^ 0 = a)、可交换结合性。这些让异或非常强大。
立即学习“C++免费学习笔记(深入)”;
- 翻转特定位:x ^ (1
-
不借助临时变量交换两个整数:
a ^= b;
b ^= a;
a ^= b;
原理是利用 a^b^b == a 和 b^a^a == b,但注意该技巧仅适用于整型且 a、b 不指向同一内存地址(否则会归零)。 - 快速判等:(a ^ b) == 0 表示 a 和 b 完全相等(对整数、指针有效);比 a == b 少一次分支预测,在某些嵌入式或汇编级优化中有意义。
移位运算(>):高效乘除与布局操作
左移(>):向右移动n位,左边补符号位(算术右移)或0(逻辑右移),C++中对有符号数的右移行为由编译器定义,但主流平台(如x86/x64)对 signed int 执行算术右移(保持符号)。
- 替代乘除(无溢出前提下):x > 2 等价于 x / 4(对非负x向下取整)。编译器通常自动优化,但显式写出可增强语义清晰度。
-
构建复合数据:比如把 r(8位)、g(8位)、b(8位)、a(8位) 打包成一个32位RGBA颜色值:
color = (r -
小心有符号右移陷阱:对负数如 -8 >> 1,结果不是 -4(数学上),而是实现定义。更安全的做法是先转为无符号类型再移位:
static_cast(x) >> n ,尤其在跨平台或协议解析中必须明确。











