整数转二进制代码逻辑错误排查求助:输入128输出异常
问题分析与修复
你遇到的问题核心在于二进制位的判断顺序搞反了!
咱们先理清楚你的代码逻辑:你从最小的2的幂(1,也就是2⁰)开始判断,依次到128(2⁷)。但二进制数的输出应该是从最高位(2⁷)到最低位(2⁰),这样才能得到正确的高位在前的顺序。
举个输入128的例子,你的代码执行过程是这样的:
- 第一次循环
factorOfTwo=1:128/1≥1,输出1,同时number变成128-1=127 - 接下来
factorOfTwo=2:127/2≥1,输出1,number变成125 - 以此类推,直到
factorOfTwo=64:此时number已经被减到1(128-1-2-4-8-16-32=1),1/64<1,输出0 - 最后
factorOfTwo=128:1/128<1,输出0 - 最终输出就是
11111110,和你看到的错误结果完全一致
修复方案
把循环的起始值改成128,然后每次除以2,直到factorOfTwo≥1,这样就能从最高位开始判断,输出正确的二进制顺序:
import java.util.Scanner; public class BinaryConverter { public static void main(String[] args) { Scanner input = new Scanner(System.in); int number = 0; int factorOfTwo = 0; do { System.out.println("Enter the number to convert (0-255): "); number = input.nextInt(); } while (number < 0 || number > 255); System.out.println("The number " + number + " converted to binary is : "); // 从最高位128开始,依次向下判断每一位 for (factorOfTwo = 128; factorOfTwo >= 1; factorOfTwo /= 2) { // 用位运算判断对应位是否为1,比除法更高效 if ((number & factorOfTwo) != 0) { System.out.print("1"); } else { System.out.print("0"); } } input.close(); } }
额外优化建议
- 不需要修改原始number:原来的代码每次输出1就减去对应的
factorOfTwo,这会破坏原始数值,而且完全没必要——我们只需要判断当前位是否为1即可,位运算number & factorOfTwo能更高效完成这个判断。 - 添加空格格式化输出:如果你想要像预期那样的
1000 0000格式,可以在循环里加个计数器,每输出4位就打印空格:
int count = 0; for (factorOfTwo = 128; factorOfTwo >= 1; factorOfTwo /= 2) { if ((number & factorOfTwo) != 0) { System.out.print("1"); } else { System.out.print("0"); } count++; // 每4位加空格,最后一组后不加 if (count % 4 == 0 && factorOfTwo != 1) { System.out.print(" "); } }
这样输入128就会输出1000 0000,完全符合你的预期啦!
内容的提问来源于stack exchange,提问作者A.I
相关产品推荐
相关产品推荐

