我想通过一个简单的示例了解按位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
。我不知道这是怎么发生的。有人可以教育我吗?
答案 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 = 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
是带符号类型,这意味着第一位是一个符号,整个系统是Two complemnt。
所以x = 0b 1111 1111 1111 1111 1111 1111 1111 0111
是x = -9
例如
x = 0b 1111 1111 1111 1111 1111 1111 1111 1111
是x = -1
并且x = 0b 0000 0000 0000 0000 0000 0000 0000 0010
是2
详细了解“两个”。