You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:37:07