按位非操作如何给出负值
How does bitwise not operation give negative value
我想通过一个简单的例子看看按位取反是如何工作的:
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 也会影响该位,因此任何正数都会变成负数,反之亦然。
请注意,"dedicated bit" 有点过于简单化了,因为大多数当代计算机 而不是 使用 "sign and magnitude" 表示(其中符号位只会切换符号),但 "two's complement" 表示,其中符号位也会影响大小。
例如,8 位有符号整数 00000000
将为 0,但 10000000
(符号位翻转)将为 -128。
(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
的二进制
嗯,说来话长。
为了更容易理解,让我们使用二进制数。
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
了解更多关于二次元的信息。
我想通过一个简单的例子看看按位取反是如何工作的:
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 也会影响该位,因此任何正数都会变成负数,反之亦然。
请注意,"dedicated bit" 有点过于简单化了,因为大多数当代计算机 而不是 使用 "sign and magnitude" 表示(其中符号位只会切换符号),但 "two's complement" 表示,其中符号位也会影响大小。
例如,8 位有符号整数 00000000
将为 0,但 10000000
(符号位翻转)将为 -128。
(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
的二进制
嗯,说来话长。
为了更容易理解,让我们使用二进制数。
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
了解更多关于二次元的信息。