按位NOT的奇怪输出

时间:2010-08-11 19:48:56

标签: c++ bit-manipulation

我试图将0的补码变为1,但得到4294967295.这就是我所做的:

 unsigned int x = 0;
 unsigned int y= ~x;
 cout << y;

我的输出是4294967295,但我期望1,为什么会这样?顺便说一句,我是用C ++做的。

6 个答案:

答案 0 :(得分:26)

你为什么期待1?逐位补码翻转所有位。

00000000000000000000000000000000 = 0
              |
          bitwise NOT
              |
              v
11111111111111111111111111111111 = 4294967295

也许你在想logical NOT。在C ++中,这被写为!x

答案 1 :(得分:6)

你必须用二进制来看这个,以确切了解发生了什么。

unsigned int x = 0,在记忆中是00000000 00000000 00000000 00000000

~x语句翻转所有位,意味着以上变为:

11111111 11111111 11111111 11111111

以十进制形式转换为4294967295。

XOR只允许您翻转某些位。如果您只想翻转最低位,请改用x ^ 1

答案 2 :(得分:2)

你从哪里得到1的期望?

您对按位操作的理解清楚地表明缺乏,在发布此处之前首先完成它们是明智的...

你不会混淆这是合乎逻辑的NOT,是吗?

按位补码或按位NOT操作将所有位从1翻转为0,反之亦然,具体取决于位掩码的设置位置,例如,1是

00000000 00000000 00000000 00000001

执行按位而不是将其翻转为

11111111 11111111 11111111 11111110

,它为32位系统提供了最大值小于1的整数数据类型。

这是一个有价值的链接,向您展示如何在此处bit-twiddling

答案 3 :(得分:0)

一个整数不仅仅是1位(它是4个字节,或32位)。通过注意它,你翻转一切,所以在这种情况下00000 ...变成了11111 ......

答案 4 :(得分:0)

〜翻转输入中的所有位。你的输入是一个无符号的int,它有32位,所有这些都是0.翻转每个0位代替32位1位,对于那个大数字是二进制的。

如果您只想翻转最低有效位,可以使用y = x ^ 1 - 也就是说,改为使用XOR。

答案 5 :(得分:0)

您可以使用

unsigned int y= !x;

得到y = 1;