3

我想通过一个简单的例子来看看按位 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。我不明白这是怎么发生的。任何人都可以教育我一点吗?

4

3 回答 3

6

(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

这是-3二进制

于 2019-02-11T01:24:13.197 回答
2

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

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

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

于 2019-02-11T01:23:16.283 回答
2

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

x = 4或者x = 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是有符号类型,这意味着第一位是符号,整个系统是两个补码。

so x = 0b 1111 1111 1111 1111 1111 1111 1111 0111isx = -9
和 例如 x = 0b 1111 1111 1111 1111 1111 1111 1111 1111isx = -1x = 0b 0000 0000 0000 0000 0000 0000 0000 0010is2

了解有关二补的更多信息。

于 2019-02-11T01:41:26.497 回答