2012-09-13 26 views
2

为什么〜0xF等于0xFFFFFFF0?为什么在32位机器上〜0xF等于0xFFFFFFF0?

此外,如何为~0xF && 0x01 = 1?也许我也没有得到0x01。

+2

'&&'是逻辑AND,不是按位AND。 〜是一个标准的按位操作。 – chris

+0

我知道做什么,但我认为0xF(即使在32位)将是0x11111111? – sebi

+2

'0xF'是'0x0000000F'。在什么世界将等于'0x11111111'? –

回答

12

问题1

为什么〜0xF等于0xFFFFFFF0?

首先,这意味着你在32位机器上运行它。这意味着0xF实际上是在hexadecimal0x0000000F

这意味着0xF是 0000 0000 0000 0000 0000 0000 0000 1111的二进制形式。

~的操作装置的非操作。在二进制表示中,每0到1和每1到0更改。这将使〜0xF成为:二进制表示中的 1111 1111 1111 1111 1111 1111 1111 0000

这实际上是0xFFFFFFF0

请注意,如果你这样做了16位机上的~0xF答案是0xFFF0

问题2

你写了错误的说法,应该是0xF & 0x1。请注意,0x10x01,0x0010x0001都是相同的。因此,让我们改变这个hexdecimal号二进制表示:

0xF是:

0000 0000 0000 0000 0000 0000 0000 1111

0x1是:

0000 0000 0000 0000 0000 0000 0000 0001

&操作遵循以下规则:

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1 

这样算下来,为每一位,你得到的结果是:

0000 0000 0000 0000 0000 0000 0000 0001

这实际上是0x1

附加

|装置按位或运算。它遵循:

0 | 0 = 0 
0 | 1 = 1 
1 | 0 = 1 
1 | 1 = 1 

^指按位异或运算。它遵循:

0^0 = 0 
0^1 = 1 
1^0 = 1 
1^1 = 0 

你可以得到更多的信息here

+0

为了记录,给出的AND,OR和XOR规则列表被称为真值表,如果它使它们更容易找到。 – chris

+0

@chris谢谢:) – shengy

+0

谢谢,很好解释! – sebi

0

你否定0xF,其翻转所有位的他们的倒数。因此,例如,您有8位:0xF = 00001111。如果你否定它,它会变成11110000

由于您使用的是32位,所以F就完全扩展了。 1111 .... 0000

关于第二个问题,您使用的是逻辑与,不按位与。这两个行为完全不同。

+1

“您正在否定0xF” - 错误;倒置不是否定。 –

0

这听起来像你的困惑是,你相信0xF是一样的0b1111111111111111。它不是,它是0b0000000000001111。

0

〜0xF反转其所有位,去

from 0x0000000F = 00000000000000000000000000001111 (32 bits) 
to 0xFFFFFFF0 = 11111111111111111111111111110000 (32 bits) 

一个& & b为1,如果a和b是非零,和〜0xF和0x01都是非零的。

0

在C中,~0xF永远不能等于0xFFFFFFF0。前者是负数(C允许的三个签名表示中的任何一个),后者是一个正数。但是,如果二者在二进制补码实现中转换为32位无符号类型,转换后的值将相等。

至于~0xF && 0x01&&算子是逻辑的,而不是按位和。

相关问题