所以我这样做,我认为它会给我+7但它给我-3。
public class BitManipulation{
public static void main (String[] args){
System.out.println(~2 | 5 >> ((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)