📜  为什么不按位运算给出负数? (1)

📅  最后修改于: 2023-12-03 15:06:16.645000             🧑  作者: Mango

为什么不按位运算给出负数?

在计算机科学中,位运算非常常见。但是,有时候我们会发现那些令人困惑的负数并没有按照我们所期望的方式运算,这是为什么呢?

这是因为计算机使用的是二进制补码表示法(two's complement)。在这种表示法中,最高位被用作符号位,表示数字的正负性。如果这个位为1,那么数字就是负数,否则就是正数。

在计算机中,负数和正数用不同的二进制表示方式。例如,当使用8位补码表示-1时,我们需要把1表示成二进制形式(00000001),然后取反(11111110),最后加1(11111111)。这个结果是-1的8位补码。

当我们进行以“按位运算”的方式进行处理时,二进制位的操作不会考虑符号位的影响,因此会得到错误的结果。例如,-1按位左移一位将得到-2,因为左移操作会移动所有位,包括符号位。

因此,要在计算机中正确地处理负数,我们需要使用特殊的运算方法。例如,在Java中,使用有符号移位运算符(>>)和无符号移位运算符(>>>)可以正确地处理负数。在其他语言中也有类似的解决方案。

总之,要正确地处理负数,我们需要特别注意计算机使用的二进制补码表示法及其运算方式。只有在正确理解这些概念后,我们才能正确处理负数的运算。

int a = -1;
System.out.println(a << 1); //-2
System.out.println(a >> 1); //-1
System.out.println(a >>> 1); //2147483647

在Java中,a << 1的结果为-2,这是因为位移左侧的符号位是1,被移位后会变成0,因此结果为-2。a >> 1的结果为-1,这是因为这是一个有符号移位,符号位不会发生变化。a >>> 1的结果为2147483647,这是因为这是一个无符号移位,符号位被视为一个正数位处理,因此左侧的符号位变成了0。