我想取0的补数拿到1,但我得到4294967295这是我做了什么:按位奇怪的输出功率不
unsigned int x = 0;
unsigned int y= ~x;
cout << y;
我的输出为4294967295但我希望1,这是为什么这是吗?顺便说一下,我在C++中这样做。
我想取0的补数拿到1,但我得到4294967295这是我做了什么:按位奇怪的输出功率不
unsigned int x = 0;
unsigned int y= ~x;
cout << y;
我的输出为4294967295但我希望1,这是为什么这是吗?顺便说一下,我在C++中这样做。
你为什么期望1?按位补码翻转全部位。
00000000000000000000000000000000 = 0
|
bitwise NOT
|
v
11111111111111111111111111111111 = 4294967295
也许你正在考虑一个logical NOT。在C++中,这写成!x
。
整数不只是1位(它是4个字节或32位)。通过注意它,你可以翻转所有东西,所以在这种情况下,00000 ...变成11111 ...
〜翻转输入中的所有位。你的输入是一个无符号的整数,它有32位,全部为0.翻转每个0位给你32个1位,而这对于那个大数是二进制的。
如果您只想翻转最不重要的位,可以使用y = x^1
- 即使用XOR来代替。
你从哪里得到期望值1?
你的位操作的理解,清楚地表明缺乏,这将是审慎的,通过他们先在这里发布前工作...
你不是一个混乱!这是一个逻辑NOT,是吗?
一个〜按位补码或按位非运算翻转从1到0,反之亦然所有的位不同的地方在掩码被设定,因此,例如,一个1是
00000000 00000000 00000000 00000001
做一个〜位NOT上,它翻转到
11111111 11111111 11111111 11111110
,让你最大值的整数数据类型的32位系统上少1。
这是一个有价值的链接,它告诉你如何在这里做bit-twiddling。
你必须在二进制文件中看到这个,以准确理解发生了什么。
unsigned int x = 0
,在内存中是00000000 00000000 00000000 00000000
。
的~x
语句翻转所有的位,这意味着在上述匝数成:
11111111 11111111 11111111 11111111
其转换为4294967295十进制形式。
异或将允许您只翻转某些位。如果您只想翻转最不重要的位,请改为使用x^1
。
您可以使用
unsigned int y= !x;
得到Y = 1;
1s补码取决于你正在寻找补码的东西的位数。补码的定义特征是你有两个都是零的数字。 1s补码中的否定操作相当于您所观察到的按位非操作符。我认为你对1s如何补充作品有一个错误的想法。 – Omnifarious 2010-08-11 20:00:48