Java 中的一元补码(波浪号 ~)运算符

Unary complement (tilde ~) operator in Java

我刚开始学习编程 Java。我做了一个计算整数补码的程序

package demo;

public class unaryOperators {
    public static void main(String[] args) {
        int numOne = 10;
        System.out.println(~numOne);
    }
}

程序运行没有任何错误,但输出不符合预期!输出是 -11 但据我所知,按位补码运算符对数字的所有位进行补码。

10 的十进制是 1010

所以,~10 应该是 0101 即十进制的 5

我参考了一些文章,但找不到像我这样的新手可以简单理解的文章。

感谢您的宝贵时间!

Java 个整数存储在 two's complement 中。假设(为简单起见)我们将数据存储在一个字节中,10

00001010

所以~10

11110101

如果二进制补码的前导位是1,那么这个数是负数,这个数的精确值是它的补码加一(的负数),因此-11.您可以在链接的维基百科页面中详细了解为什么这种格式是这样写的。

在 Java 中,int 是一个 32 位值。因此,当您对 10(十进制)进行补码时,它是
0000 0000 0000 0000 0000 0000 0000 1010(二进制)而不仅仅是 4 位 1010(二进制)。

因此,32位值~10的补码是
1111 1111 1111 1111 1111 1111 1111 0101(二进制)已签名 -11(十进制)和您得到的输出。

如果您只使用 4 位数字,您只需将整数值与 0xF(十六进制)进行异或,即 1111(二进制)。全 1 的 XOR 执行整数的补码。

int numOne = 10;
System.out.println(numOne ^ 0xF);

这会给你正确的输出。希望这对您有所帮助!