长型,左移和右移操作

时间:2009-11-23 14:54:31

标签: c# .net bitwise-operators

继续我之前的问题 Why I cannot derive from long?

我发现了一个有趣的问题。

第一步:

4294967296 & 0xFFFFFFFF00000000

结果:4294967296。

第二步。

4294967296 & 0x00000000FFFFFFFF

结果:0

啊哈,所以我在这里假设4294967296 == 0xFFFFFFFF

我们来看看

(long)0x00000000FFFFFFFF

结果:4294967295。失败。

让我们仔细检查

4294967296 >> 32

结果:1​​。失败。

唯一的解释是,因为我在很长的地方使用 有些是为标志保留的。在C中我会使用unsigned long。 你觉得怎么样?

3 个答案:

答案 0 :(得分:5)

4294967296 & 0xFFFFFFFF00000000 = 4294967296

这表示值4294967296在低32位中没有设置位。实际上,4294967296是0x100000000,所以这是真的。

4294967296 >> 32 = 1

再次,一致。

换句话说,4294967296为0xFFFFFFFF的结论是错误的,所以剩下的检查不支持这个。

答案 1 :(得分:3)

嗯......我不确定你为什么得出你的结论,但4294967296是0x100000000。用易读的十六进制写出按位AND ...

0x0000000100000000 &
0x00000000FFFFFFFF =
0x0000000000000000

0x0000000100000000 &
0xFFFFFFFF00000000 =
0x0000000100000000

这两者都很有道理。也许你误解了一个按位AND ...它映射了两者中相同的位。您的注释似乎更适合按位异或而不是按位AND(这不是您正在使用的操作)...

答案 2 :(得分:1)

我认为您无法理解按位and操作。按位and将返回两者中设置的位。如果两者相同那么

(4294967296 & 0xFFFFFFFF00000000) == 4294967296

(4294967296 & 0xFFFFFFFF00000000) == 0xFFFFFFFF00000000

都会坚持,但他们显然不会。