2010-08-11 67 views
10

我想取0的补数拿到1,但我得到4294967295这是我做了什么:按位奇怪的输出功率不

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

我的输出为4294967295但我希望1,这是为什么这是吗?顺便说一下,我在C++中这样做。

+0

1s补码取决于你正在寻找补码的东西的位数。补码的定义特征是你有两个都是零的数字。 1s补码中的否定操作相当于您所观察到的按位非操作符。我认为你对1s如何补充作品有一个错误的想法。 – Omnifarious 2010-08-11 20:00:48

回答

21

你为什么期望1?按位补码翻转全部位。

00000000000000000000000000000000 = 0 
       | 
      bitwise NOT 
       | 
       v 
11111111111111111111111111111111 = 4294967295 

也许你正在考虑一个logical NOT。在C++中,这写成!x

0

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

0

〜翻转输入中的所有位。你的输入是一个无符号的整数,它有32位,全部为0.翻转每个0位给你32个1位,而这对于那个大数是二进制的。

如果您只想翻转最不重要的位,可以使用y = x^1 - 即使用XOR来代替。

2

你从哪里得到期望值1?

你的位操作的理解,清楚地表明缺乏,这将是审慎的,通过他们先在这里发布前工作...

你不是一个混乱!这是一个逻辑NOT,是吗?

一个按位补码或按位非运算翻转从1到0,反之亦然所有的位不同的地方在掩码被设定,因此,例如,一个1是

 
00000000 00000000 00000000 00000001 

做一个位NOT上,它翻转到

 
11111111 11111111 11111111 11111110 

,让你最大值的整数数据类型的32位系统上少1。

这是一个有价值的链接,它告诉你如何在这里做bit-twiddling

4

你必须在二进制文件中看到这个,以准确理解发生了什么。

unsigned int x = 0,在内存中是00000000 00000000 00000000 00000000

~x语句翻转所有的位,这意味着在上述匝数成:

11111111 11111111 11111111 11111111

其转换为4294967295十进制形式。

异或将允许您只翻转某些位。如果您只想翻转最不重要的位,请改为使用x^1

0

您可以使用

unsigned int y= !x; 

得到Y = 1;