提取特定位只需右移目标位至最低位再与1按位与,如(13>>2)&1=1;提取连续多位则先右移使目标段对齐低位,再用掩码清零无关位,如(x>>3)&0xf取第3~6位。

直接用位运算提取特定位,核心就两步:右移把目标位挪到最低位,再和 1 按位与保留它。这比转字符串、取模或除法快得多,因为它是单条 CPU 指令。
为什么要用位移+与操作来提位
计算机里所有整数都以二进制补码形式存储,每一位都有确定位置(从右往左编号,最低位是第 0 位)。想看某一位是 0 还是 1,最自然的方式不是“算”,而是“搬”——把它搬到最容易读的位置(即最低位),再用 & 1 把其他位全清掉。
- 右移 k 位:x >> k,把第 k 位移到第 0 位
- 再与 1:(x >> k) & 1,只留下最低位,结果非 0 即 1
- 例如 x = 13(二进制 1101),提第 2 位:(13 >> 2) & 1 = (1101 >> 2) & 1 = 11 & 1 = 1
实际中怎么批量提取连续多位
如果要取的不是单个位,而是中间一段(比如第 3~6 位),就得组合掩码:
- 先右移,让目标段落到低位:x >> 3
- 再用掩码把无关高位清零:& 0b1111(即 15)
- 合起来就是:(x >> 3) & 0xF
- 更通用写法:(x >> start) & ((1 ,其中 width 是要取的位数
底层为什么这么快
位移和按位与在硬件层面对应 AND、SHR 等原生指令,通常 1 个时钟周期完成。而 x % 8 或 (x / 4) % 2 需要多步算术运算,还可能触发除法器流水线延迟。尤其在嵌入式、高频循环或基数排序等场景,这种差异会放大成显著性能优势。
常见易错点提醒
实际编码时要注意三点:
- 右移对有符号数可能是算术右移(补符号位),为避免歧义,建议对提取操作统一用无符号类型(如 uint32_t)
- 位序从 0 开始计数,别把第 0 位当成最高位
- 掩码构造别写错:要取 4 位,掩码是 0xF(即 15),不是 0x4 或 4










