6

我正在尝试编写一个程序来在输入二进制数后计算 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。

有什么帮助吗?

4

3 回答 3

12

您可能想以二进制工作,所以请尝试:

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
11111111111111111111111111111111111111111111111111111111000100

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

于 2013-10-26T17:21:04.120 回答
1

运算符按你的~想法做,但请记住,Java 中没有无符号类型,所以当你输入一个正数(即高位为 0)时,应用~它会使其变为负数(通过将高一点点)。

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

于 2013-10-26T17:20:04.120 回答
0
  • 计算 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;
}
于 2021-12-29T15:18:09.137 回答