Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我会得到-3';我不会得到+;7._Java_Bit Manipulation - Fatal编程技术网

Java 为什么我会得到-3';我不会得到+;7.

Java 为什么我会得到-3';我不会得到+;7.,java,bit-manipulation,Java,Bit Manipulation,所以我在做这个,我以为它会给我+7,但它会给我-3 public class BitManipulation{ public static void main (String[] args){ System.out.println(~2 | 5 >> ((2 & 2))); } } 尝试按如下方式打印每个步骤: System.out.println(2 & 2); 您将了解到2&2=2(我们正在对两个二进制数=>0010和0010=0010(即2)

所以我在做这个,我以为它会给我+7,但它会给我-3

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

尝试按如下方式打印每个步骤:

System.out.println(2 & 2);
您将了解到2&2=2(我们正在对两个二进制数=>0010和0010=0010(即2)执行按位“AND”函数),因此将其插入下一步:

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)

2&2是2

那么你有5>>2,它给出1(二进制中的5是101)

因此,我们仍然使用
~2|1

~2正在反转所有位。对于8个二进制数字(32也一样,但让我们保持简洁…),00000010(2)的位反转为11111101。或者用1来表示这一点不会改变任何事情

现在,11111101-当作为一个数字处理时,它被解释为2的补码。在这个系统中,最高有效位是符号,这里是1,所以数字是负数。为了得到2的补码中数字的绝对值,我们需要将位反转并加1


因此,将11111101倒置得到00000010,再加上1得到00000011,也就是3。回想一下,这个符号是负号,所以这里有-3!!!:-)

为什么你认为你应该得到7?提示:不要打印最终操作的结果;为什么不打印发生的每个“子操作”的结果?或者在调试器中运行它?当你做到这一点;你不明白为什么2&2会给出它所给出的结果。。...左右那么也许这就构成了一个问题。但到目前为止,你只写了:“请告诉我如何分解这个简单的小表达式”—3是最合理的结果-1如果运算符优先级错误。就我所知,7是毫无意义的。