提取整数中第2至5位需三步:构造掩码(1

要从一个整数中提取某一段连续的比特位(比如第2位到第5位),关键在于三步:构造精准掩码、按位与保留目标段、右移归零对齐。整个过程不依赖库函数,纯靠位运算,效率高且可移植。
明确目标区间和位编号规则
位编号必须从右往左,最低位是第0位。例如要取 第2位到第5位(含),共4位:
- bit_low = 2,bit_high = 5
- 位数 count = 5 − 2 + 1 = 4
- 基础掩码(低4位全1)= 0b1111 = 15 = (1
- 最终掩码 = 基础掩码
用掩码+与运算锁定目标段
假设原数 num = 173,二进制为 0b10101101(8位),我们要提取第2–5位(即从右数第2、3、4、5位,对应值为 1011):
- mask = 0b111100(十进制 60)
- num & mask = 0b10101101 & 0b00111100 = 0b00101100
- 此时结果是“带偏移的片段”,还不是纯数值 1011(11)
右移把目标段落到最低位
上一步得到的是 0b00101100,需右移 bit_low = 2 位,让目标段对齐到第0位:
- k = (num & mask) >> bit_low = 0b00101100 >> 2 = 0b00001011 = 11
- 结果就是你要的连续4位对应的无符号整数值
- 通用公式:k = (num & ((1 > bit_low
常见错误与规避要点
实际写代码时容易踩坑,注意这几点:
- 别手写二进制掩码常量(如 0b111100),跨平台或字长变化时易错位;统一用
(1 构造 - 确保操作数为无符号类型(如
uint32_t),避免右移时符号扩展干扰 - 若只判断某一位是否为1,不用右移:直接用
if (num & (1 - 提取后结果是 0~(2ⁿ−1) 范围内的整数,无需再 & 0xFF,除非你后续要存入字节变量










