逐位不运算如何给出负值

时间:2019-02-11 01:16:45

标签: c++ bit-manipulation bitwise-not

我想通过一个简单的示例了解按位NOT的工作原理:

int x = 4;
int y;
int z;
y = ~(x<<1);
z =~(0x01<<1);
cout<<"y = "<<y<<endl;
cout<<"z = "<<z<<endl;

这将产生y = -9z = -3。我不知道这是怎么发生的。有人可以教育我吗?

3 个答案:

答案 0 :(得分:3)

python会将一位移位,所以

(x<<1)

将变为:

00000000 00000000 00000000 00000100

00000000 00000000 00000000 00001000 的表示形式。然后8将所有位反转,使​​其变为:

~

11111111 11111111 11111111 11110111 的表示形式。


-9

0x01

用二进制表示,因此移位一次就变成:

00000000 00000000 00000000 00000001

然后应用00000000 00000000 00000000 00000010 时,我们得到:

~

二进制中的11111111 11111111 11111111 11111101

答案 1 :(得分:2)

整数是正数还是负数(整数的 sign )都存储在专用位中,即 sign位。按位NOT也不会影响该位,因此任何正数都将变为负数,反之亦然。

请注意,“专用位”有点过分简化,因为大多数现代计算机不使用“符号和幅度”表示法(其中符号位仅会切换符号),而“二进制补码”表示,其中符号位也影响幅度。

例如,8位带符号整数00000000将为0,而10000000(符号位被翻转)将为-128。

答案 2 :(得分:2)

好吧,背后还有很长的故事。
为了更容易理解,我们使用二进制数。

x = 4x = 0b 0000 0000 0000 0000 0000 0000 0000 0100,因为sizeOf(int) = 4
x<<1 x = 0b 0000 0000 0000 0000 0000 0000 0000 1000之后和
之后 ~(x<<1) x = 0b 1111 1111 1111 1111 1111 1111 1111 0111

,然后开始复杂化。由于int是带符号类型,这意味着第一位是一个符号,整个系统是Two complemnt

所以x = 0b 1111 1111 1111 1111 1111 1111 1111 0111x = -9
例如 x = 0b 1111 1111 1111 1111 1111 1111 1111 1111x = -1 并且x = 0b 0000 0000 0000 0000 0000 0000 0000 00102

详细了解“两个”。