【问题标题】:Finding 1's complement寻找 1 的补码
【发布时间】:2013-10-26 17:17:00
【问题描述】:

我正在尝试编写一个程序来在输入二进制数后计算 1 的补码。 这是我必须要做到的:

import java.util.Scanner;
public class BitWiseComplement {
    public static void main(String[] args) {
        Scanner keysIn = new Scanner(System.in);
        System.out.println("Please enter your number: ");
        long originalNum = keysIn.nextLong();
        System.out.println(~originalNum);
  }
}

但是,当我输入 0111011 时,我得到 -111012。我认为 ~ 运算符应该反转数字,以便所有 0 都是 1,所有 1 都是 0。

有什么帮助吗?

【问题讨论】:

  • 第一位是符号。请改用无符号。
  • @ceving Java 没有无符号长类型。
  • @Boann 我没有一天没有学到 Java 学不到的新东西。

标签: java ones-complement


【解决方案1】:

你大概想用二进制工作,所以试试:

Scanner keysIn = new Scanner(System.in);
System.out.print("Please enter your number: ");

long originalNum = keysIn.nextLong(2);  // specify radix of 2
System.out.println(Long.toBinaryString(~originalNum));  // print binary string

keysIn.close();
请输入您的号码:0111011 111111111111111111111111111111111111111111111111111111111000100

如您所见,所有位都被翻转。请记住,您输入的二进制数前面有前导 0。

【讨论】:

  • ..这就是为什么我们都是正确的?因为 0 没有显示,但是它们在那里。顺便谢谢!
  • 0111011 的一个补码是 1000100 但是为什么有这么多 1 的答案,我怎样才能摆脱他们?
【解决方案2】:

~ 操作符按照您的想法执行,但请记住,Java 中没有无符号类型,因此当您输入正数(即高位为 0)时,将 ~ 应用于它将使其变为负数(通过打开高位)。

如果您要以十六进制(或二进制,如其他答案所建议的那样)打印数字,您应该会看到您期望的答案。

【讨论】:

  • Java 整数是 2s 的恭维。例如:System.out.println(~0); 将 -1 打印到控制台。
【解决方案3】:
  • 计算 num 中的位数。
  • 制作一个长度相同的 1 掩码。
  • 与数字异或得到补码。

例如。 9^15=6

  public static int solution(int num) {

    int bits = Integer.toBinaryString(num).length();
    int maxBound = (int)( Math.pow(2, bits)-1);
    return num ^ maxBound;
}

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2010-12-30
    • 1970-01-01
    • 2011-06-03
    • 2023-03-30
    相关资源
    最近更新 更多