Java位操作实验:32位全置1的int类型值是多少?
32位全置1的int值确认及Java位操作实验解析
刚好做过类似的位操作实验,来给你明确解答:32位int类型所有位全置1时,它的十进制值确实是-1。这背后的核心原因是Java的int类型采用补码表示法存储有符号整数:
- 正数的最高位是0,二进制值直接对应十进制数值
- 负数的最高位是1,此时需要通过“对补码取反加1”来还原出原码对应的十进制负数
当32位全为1时,符号位是1(说明是负数),对剩下的31位取反得到全0,加1后结果是1,所以对应的原码就是-1。
下面附上实验代码,包含逐个置位的逻辑和你提到的countSetBits函数:
完整实验代码
public class BitOpsTest { public static void main(String[] args) { int target = 0; // 从0位到31位逐个置1 for (int bitPos = 0; bitPos < 32; bitPos++) { target |= (1 << bitPos); System.out.printf("设置第%d位后,当前值: %d%n", bitPos, target); } System.out.println("\n32位全置1的int最终值: " + target); // 输出-1 // 用countSetBits验证置位数量 System.out.println("统计置1的总位数: " + countSetBits(target)); // 输出32 } // 统计整数中置为1的位的数量 private static int countSetBits(int number) { int count = 0; // 用无符号右移处理负数,避免符号位补1导致死循环 while (number != 0) { count += number & 1; // 检查最低位是否为1 number >>>= 1; // 无符号右移一位,高位补0 } return count; } }
代码细节说明
- 循环里的
target |= (1 << bitPos)操作,会把第bitPos位的掩码和当前target做按位或,从而将该位设为1 countSetBits函数使用无符号右移(>>>)而不是普通右移(>>),是因为普通右移对负数会一直补符号位(1),导致循环无法终止;无符号右移会统一补0,能正确遍历所有32位
内容的提问来源于stack exchange,提问作者Athul Muralidharan
相关产品推荐
相关产品推荐

