java中可通过右移k位再与1按位与提取int的第k位(0~31),如(10>>1)&1得1;需校验k范围,long为0~63,byte/short需先掩码;批量取位用(x>>a)&((1

Java 中可以通过位运算符配合移位操作,快速提取整型变量(如 int)的某一位二进制值(0 或 1)。核心思路是:将目标位移到最低位(第 0 位),再用按位与 & 1 提取该位。
使用右移 + 按位与提取指定位
假设要获取整数 n 的第 k 位(从右往左,从 0 开始编号,即最低位是第 0 位):
- 先将
n逻辑右移k位:n >> k(对非负数可用>>;若需处理负数且保证补码高位补 0,用>>k) - 再与
1按位与:(n >> k) & 1,结果就是第k位的值(0 或 1)
例如:int n = 10;(二进制 1010),取第 1 位(即右数第 2 位):(10 >> 1) & 1 == (5) & 1 == 1,正确。
注意位序和数据类型范围
int 在 Java 中是 32 位有符号整数,有效位为 0~31。访问 k ≥ 32 时,右移会按模 32 处理(如 n >> 32 等价于 n >> 0),可能不符合预期。建议校验 k 是否在 [0, 31] 范围内。
- 若需支持
long(64 位),位索引范围应为[0, 63] - 对
byte或short,虽底层提升为int运算,但语义上只关注低 8 位或 16 位,可先做掩码(如& 0xFF)再操作
封装成工具方法更安全易用
可写一个通用方法避免重复逻辑:
public static int getBit(int n, int k) {
if (k 31) throw new IllegalArgumentException("bit index must be 0-31");
return (n >> k) & 1;
}
调用如 getBit(12, 2)(12 是 1100,第 2 位为 1)返回 1。
扩展:批量获取连续多位
若需提取连续若干位(如第 a 到第 b 位,含端点),可先右移至低位,再用掩码保留所需位数:
- 右移
a位使目标段对齐到最低位 - 构造掩码:
(1 (例如取 3 位 → 掩码为 <code>111₂ = 7) - 最终:
(n >> a) & mask
例如取 int x = 0b11010110 的第 2~4 位(共 3 位):(x >> 2) & 0b111 == 0b110101 & 0b111 == 0b101 == 5。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











