我想通过一个简单的例子来看看按位 NOT 是如何工作的:
int x = 4;
int y;
int z;
y = ~(x<<1);
z =~(0x01<<1);
cout<<"y = "<<y<<endl;
cout<<"z = "<<z<<endl;
这导致y = -9
和z = -3
。我不明白这是怎么发生的。任何人都可以教育我一点吗?
我想通过一个简单的例子来看看按位 NOT 是如何工作的:
int x = 4;
int y;
int z;
y = ~(x<<1);
z =~(0x01<<1);
cout<<"y = "<<y<<endl;
cout<<"z = "<<z<<endl;
这导致y = -9
和z = -3
。我不明白这是怎么发生的。任何人都可以教育我一点吗?
(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
二进制
整数是正数还是负数(整数的符号)存储在专用位符号位中。按位 NOT 也会影响该位,因此任何正数都会变为负数,反之亦然。
请注意,“专用位”有点过于简单化了,因为大多数当代计算机不使用“符号和幅度”表示(符号位只会切换符号),而是使用“二进制补码”表示,其中符号位也影响幅度。
例如,8 位00000000
有符号整数将为 0,但10000000
(符号位翻转)将为 -128。
好吧,背后有一个很长的故事。
为了更容易理解,让我们使用二进制数。
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 0111
isx = -9
和 例如
x = 0b 1111 1111 1111 1111 1111 1111 1111 1111
isx = -1
和x = 0b 0000 0000 0000 0000 0000 0000 0000 0010
is2
了解有关二补的更多信息。