为什么判断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
相关产品推荐
相关产品推荐

