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

为什么判断2的幂的Java代码中按位AND操作对≥8的数值运行异常

问题原因
  • 代码的核心错误出在二进制字符串转整数的处理逻辑上:调用Integer.toBinaryString(n)得到的是n的二进制格式字符串,比如n=8时返回"1000",但后续调用Integer.parseInt(s)时,该方法默认会将输入字符串按十进制规则解析,也就是把二进制的"1000"当成十进制数值1000处理,同理n=7的二进制字符串"111"会被解析为十进制数值111,两个十进制值做按位与运算自然会得到错误结果104。
  • n≤7时输出正常是因为这些数值的二进制最多只有3位,二进制字符串转十进制后的数值和原始数值刚好一致,比如二进制100转十进制是4,和原始n=4的数值相等,因此按位与结果刚好符合预期。
修复方案

最优实现(推荐)

不需要做多余的字符串转换,直接对原始int值做按位与运算即可,同时补充了非正整数的边界判断(2的幂均为正整数):

import java.util.Scanner;

public class PowerOfTwoJudge {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        System.out.println(n > 0 ? (n & (n - 1)) : 1);
        input.close();
    }
}

兼容原写法的修正(不推荐,仅做错误演示)

如果要保留转二进制字符串的逻辑,需要在调用Integer.parseInt时指定按二进制规则解析:

import java.util.Scanner;

public class PowerOfTwoJudge {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        String s = Integer.toBinaryString(n);
        String s2 = Integer.toBinaryString(n-1);
        Integer i = Integer.parseInt(s, 2);
        Integer j = Integer.parseInt(s2, 2);
        System.out.println(i & j);
        input.close();
    }
}

内容的提问来源于stack exchange,提问作者Arunesh Arulkumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:09:05