按位运算符〜给出不期望的输出

时间:2013-09-29 15:29:44

标签: java bit-manipulation signed

我写了一个简单的程序,其中我有一个按位运算符,它在java中给出了有符号值。但是当我这样做时,它返回的值高于原始值。

class bit
{

public static void main(String[] args)
{


int j=10;

System.out.println("jjjj"+~j);

}

}

给出输出:

-11。其预期输出应为-9。有什么问题?

2 个答案:

答案 0 :(得分:1)

如果我们查看数字10的二进制文件,我们可以看到

  <00> 0000 0000 0000 0000 0000 0000 0000 1010

第一个0是签名位。

如果我们现在翻转二进制包含签名位,我们得到:

  

1111 1111 1111 1111 1111 1111 1111 0101

其中......如果你认为java使用有符号整数,则为-11。

如果我们离开有符号的数字一秒钟,只考虑一个4字节无符号整数的值~10,我们得到的值为:4294967285。

要将无符号整数转换为二进制补码有符号整数,我们将从整数中减去2 ^ 32的值,如果则超过2 ^ 31 - 1。

2 ^ 32 - 4294967285 = -11

答案 1 :(得分:1)

0000 1010 // = 10 i.e binary representation of 10
1111 0101 // = ~10 i.e inversion of bits

负数以2的补码形式存储。 Check this for details

0000 1011 // = 11 i.e binary 11
1111 0100 // inversion of bits
1111 0101 // 2's complement of 11 = -11

因此,

  

~10 = -11