如何将二进制转换为对应补码十进制值?Booth算法结果转换问题
16位补码二进制转对应十进制的简洁实现方案
问题根源
你当前使用Integer.parseInt(answer,2)得到的是无符号十进制值,该方法默认将输入的二进制串识别为无符号数,而你通过Booth算法得到的1111111110101111是16位有符号补码,因此才会输出65455而非正确的-81。
优化方案
不需要比对原操作数的乘积结果,直接通过补码的数学规则做转换即可,通用逻辑为:n位补码的真值 = 无符号解析值 - (最高位为1时减去2^n,否则保持原值)
你用的是16位补码,替换原有逻辑的代码如下:
public static void main(String args[]){ Scanner sc = new Scanner(System.in); System.out.print("Enter the first number: "); int operand1 = sc.nextInt(); System.out.print("Enter the second number: "); int operand2 = sc.nextInt(); String answer = multiply(operand1, operand2); System.out.println("Final Product (binary): " + answer); // 替换原有逻辑开始 int unsignedVal = Integer.parseInt(answer, 2); // 16位补码转换:最高位为1时减去2^16=65536 int decimal = unsignedVal >= 0x8000 ? unsignedVal - 0x10000 : unsignedVal; // 替换原有逻辑结束 System.out.println("Final Answer (decimal): " + decimal); }
规则说明
- 16位补码的最高位是第15位(从0计数),对应权值为2^15=32768,也就是十六进制的
0x8000,无符号值大于等于该值说明为负数 - 负数补码转真值需要减去总权值2^16=65536,也就是十六进制的
0x10000 - 如果后续调整补码位数,比如改为32位,仅需要把判断阈值改为
0x80000000,减去的值改为0x100000000即可,适配性很强
内容的提问来源于stack exchange,提问作者Louie Mattia
相关产品推荐
相关产品推荐

