我试图将0的补码变为1,但得到4294967295.这就是我所做的:
unsigned int x = 0;
unsigned int y= ~x;
cout << y;
我的输出是4294967295,但我期望1,为什么会这样?顺便说一句,我是用C ++做的。
答案 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;