按位不操作如何给出负值
How does bitwise not operation give negative value
我想通过一个简单的例子看看按位 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
嗯,背后有一个很长的故事。
为了更容易理解,让我们使用二进制数。
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
是有符号类型,这意味着第一个位是一个符号,整个系统是两个完整的。
所以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
详细了解 Two complemnt。
无论整数是正数还是负数(整数的符号(都存储在专用位中,即符号位。按位 NOT 也会影响此位,因此任何正数都变为负数,反之亦然。
请注意,"专用位">有点过于简单化,因为大多数现代计算机不使用"符号和幅度"表示(符号位只会切换符号(,而是使用"二的补码"表示,其中符号位也会影响大小。
例如,8 位有符号整数00000000
为 0,但10000000
(符号位翻转(将为 -128。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 无法合并生成操作.. 先决条件不同