位扫描是逐位检查整型变量二进制位是否为1,从bit 0到bit 31;java中用无符号右移(>>>)和按位与(&)实现,n != 0可自动终止,扫描有效位。

理解位扫描的核心逻辑
逐位扫描整型变量的二进制表示,本质是依次检查从最低位(bit 0)到最高位(bit 31)每一位是否为 1。Java 中不支持直接获取某一位的值,但可通过 按位与(&) 和 右移(>>) 或 左移( 配合 while 循环实现。
方法一:右移 + 检查最低位(推荐)
每次将数字右移一位,再用 n & 1 判断当前最低位是否为 1。该方式逻辑清晰、不易越界,且能自然处理负数(按补码扫描)。
示例代码:
int n = 13; // 二进制: 1101
int i = 0;
while (n != 0) {
int bit = n & 1; // 获取当前最低位
System.out.println("第 " + i + " 位: " + bit);
n = n >>> 1; // 无符号右移 1 位(对负数也安全)
i++;
}
说明:
- 使用
>>>(无符号右移)避免负数因符号位扩展导致死循环 - 循环条件
n != 0可自动停止——当所有有效位被移出后,n 变为 0 - 若需固定扫描 32 位(包括前导零),可改用
i 作条件
方法二:左移掩码 + 按位与(适合指定位置)
保持原数不变,用一个掩码(如 1 )逐位左移,再与原数做 <code>& 运算判断对应位。
示例代码:
int n = 13; for (int i = 0; i
说明:
- 适用于必须按“从低到高”顺序输出且需完整 32 位的场景
1 在 i ≥ 31 时可能溢出,但 Java 中 int 左移自动截断,行为确定- 若只关心数值有效位,可在
n == 0 && mask > n时提前退出(需额外判断)
注意事项与常见误区
位扫描看似简单,但几个细节容易出错:
- 不要用
n >> 1处理负数——它会保留符号位,导致循环无法终止 - 避免用
n > 0作 while 条件:负数永远不满足,直接跳过 - 若需从高位(bit 31)向低位扫描,可先用
1 作初始掩码,每次右移掩码而非原数 - Java 中 int 固定 32 位,无需动态计算位宽;long 则需用 64 位和
1L掩码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











