为什么~0xFF等于0xFFFFFFF0?
另外,~0xF && 0x01 = 1
怎么样?也许我也没有得到0x01。
答案 0 :(得分:16)
问题1
为什么~0xFF等于0xFFFFFFF0?
首先,这意味着您在32位计算机上运行它。这意味着0xF实际上是hexadecimal中的0x0000000F
,
这意味着0xF是
二进制表示中的0000 0000 0000 0000 0000 0000 0000 1111
。
~
运算符表示NOT运算。 Tt在二进制表示中每隔0到1和每1到0 改变。这将使~0xF成为:
二进制表示中的1111 1111 1111 1111 1111 1111 1111 0000
。
实际上这是0xFFFFFFF0
。
请注意,如果您在16位计算机上执行此操作,则~0xF
的答案为0xFFF0
。
问题2
你写了错误的陈述,它应该是0xF & 0x1
。请注意,0x1
0x01
,0x001
和0x0001
都是相同的。所以让我们将这个十六进制数改为二进制表示:
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
。
其他强>
|
表示按位OR运算。它如下:
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。
答案 1 :(得分:3)
如果在32位“int”中存储0xF,则所有32位都会翻转,所以~0xF = 0xFFFFFFF0。
看到这个: http://teaching.idallen.com/cst8214/08w/notes/bit_operations.txt
他们给出了一个很好的解释
答案 2 :(得分:0)
你正在否定0xF,它会将所有位翻转为它们的反转。例如,您可以使用8位:0xF = 00001111
。如果您否定,则会变为11110000
。
由于你使用的是32位,所以F只是一直延伸到最后。 1111 .... 0000
对于第二个问题,您使用的是逻辑AND,而不是按位AND。这两者表现完全不同。
答案 3 :(得分:0)
听起来你的困惑是你认为0xF与0b1111111111111111相同。它不是,它是0b0000000000001111。
答案 4 :(得分:0)
~0xF反转所有位,
from 0x0000000F = 00000000000000000000000000001111 (32 bits)
to 0xFFFFFFF0 = 11111111111111111111111111110000 (32 bits)
a&&如果a和b都非零,则b为1,并且~0xF和0x01都不为零。
答案 5 :(得分:0)
在C中,~0xF
永远不能等于0xFFFFFFF0
。前者是负数(在C允许的三个有符号表示中的任何一个中),后者是正数。但是,如果在二进制补码实现上将两者都转换为32位无符号类型,则转换后的值将相等。
至于~0xF && 0x01
,&&
运算符是逻辑运算符,而不是按位运算符。