位操作核心是构造掩码1

如何用 & | ^ ~ 和移位操作单个变量的特定位
直接对整型变量做位操作,核心是构造掩码(mask)——即一个只有目标位为 1、其余位为 0 的数。所有操作都基于“变量 & 掩码”“变量 | 掩码”等组合,而不是靠条件判断或循环。
比如想操作第 n 位(从 0 开始计数),掩码就是 1 。这是所有位操作的起点,漏掉这步就容易写错。
1 是最安全的掩码构造方式;避免手写十六进制如0x04,可读性和可维护性差- 对
unsigned int或uint32_t操作最稳妥;有符号类型右移行为未定义,可能引发意外 - 位序从 0 开始(LSB 是 bit 0),别和数组下标混淆成“第 1 位”指 index=1
设置(置 1)、清除(置 0)、取反(翻转)某一位的写法
这三个是最常用操作,必须记牢对应公式,它们都不改变其他位。
- 设置第
n位:x |= (1 - 清除第
n位:x &= ~(1 —— 注意~作用在掩码上,不是作用在x上 - 取反第
n位:x ^= (1
错误写法示例:x = ~x & (1 会清空所有其他位,不是翻转;x & (1 只是读取,不修改。
立即学习“C++免费学习笔记(深入)”;
读取某一位的值(判断是否为 1)
读取不改变原值,只返回 0 或非 0(通常用 !! 转成 0/1)。
- 标准写法:
(x >> n) & 1或(x & (1 - 前者更直观(先右移到 LSB 再 &1),后者更常见(& 掩码后判断非零)
- 别直接用
if (x & (1 当布尔条件——虽然语法合法,但若后续要存结果,还是显式转!!(x & (1 更清晰
一次操作多个连续或离散位(如设置低 4 位、清除高 8 位)
多位置操作本质仍是掩码运算,只是掩码变复杂了。
- 设置低
n位:x |= (1U (例如n=4→ 掩码0b1111) - 清除低
n位:x &= ~((1U - 提取第
m到n位(含):(x >> m) & ((1U - 注意
1U强制无符号,防止左移溢出导致未定义行为(尤其在n >= 31时)
跨字节或对结构体字段做位域(bit-field)看似方便,但不可移植(大小端、对齐、填充不确定),纯位运算更可控。










