为什么我得到-3不应该得到+7

时间:2016-08-17 17:58:46

标签: java bit-manipulation

所以我这样做,我认为它会给我+7但它给我-3。

public class BitManipulation{
  public static void main (String[] args){
    System.out.println(~2 | 5 >> ((2 & 2)));
  }
}

2 个答案:

答案 0 :(得分:4)

2& 2是2。

那么你有5>> 2给出1(5为二进制为101)

所以我们留在~2 | 1

~2反转所有位。对于8个二进制数字(同样适用于32但是让事情简明扼要......)00000010(2)的位反转是11111101.用1表示这个并不会改变任何东西。

现在,11111101 - 当被视为一个数字时,它被解释为两个补码。在这个系统中,最重要的位是符号,这里它是1,所以数字是负数。要获得2的补码中的数字的绝对值,我们需要反转这些位并加1。

因此反转11111101给出00000010,并且加1给出00000011,这是3.回想标志是减号,所以你有-3 !!! : - )

答案 1 :(得分:2)

尝试打印每一步,如下:

System.out.println(2 & 2);

你会得知2& 2 = 2(我们正在执行按位" AND"函数对两个二进制数=> 0010 AND 0010 = 0010即2),所以将其插入下一步:

System.out.println(5 >> 2);

现在你有5>> 2 = 1(我们正在将这个二进制数转换为带有零的右边填充,因为数字是正数,因此0101变为0001或1),并将其插入最后一步:

System.out.println(~2 | 1);

你得到~2 | 1 = -3(我们执行按位" NOT"然后按位" OR"操作因此0010变为1101我相信这也是它变为负数并且-1101或0001给出我们-1101或-3)

相关问题