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

如何将二进制转换为对应补码十进制值?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:27:03