2009-11-23 135 views
0

继续我刚才的问题 Why I cannot derive from long?长型,左移,右移位操作

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

步骤一:

4294967296 & 0xFFFFFFFF00000000 

结果:4294967296

第二步。

4294967296 & 0x00000000FFFFFFFF 

结果:0

啊哈,所以在这里我认为4294967296 == 0xFFFFFFFF的

让我们来看看

(long)0x00000000FFFFFFFF 

结果:4294967295失败。

让我们仔细检查

4294967296 >> 32 

结果:1失败。

唯一的解释是,因为我使用很长的地方 有些位是为符号保留。在C中我会使用无符号long。 你认为什么人?

+1

一个数字看起来像......中的十进制数不能等于一个看起来像的数字。 ..F in hex。一个是偶然的,一个是奇怪的! – AakashM 2009-11-23 15:12:00

回答

5
4294967296 & 0xFFFFFFFF00000000 = 4294967296 

这表明值4294967296没有位在下部32位设置。实际上,4294967296是0x100000000,所以这是真的。

4294967296 >> 32 = 1 

再次一致。

换句话说,4294967296是0xFFFFFFFF的结论是错误的,所以其余的检查将不支持这一点。

+0

对我感到羞耻。谢谢。但我得出这个结论 调试下面的代码不起作用 long a = 2; 长b = 3; long packed = a + b << 32; //现在让我们解压 long a1 = packed&0xFFFFFFFF; long b1 = packed >> 32; 结果: a1 = 0; b1 = 5; 哪里有错误?一定是一些非常简单的错误。 – 2009-11-23 15:11:09

+0

抱歉格式不能在注释中使用 – 2009-11-23 15:12:10

+2

您的问题是操作员的注意。 Plus是在位移之前处理的。试试“long packed = a +(b << 32);” – fyjham 2009-11-23 15:14:07

1

我认为你不能理解按位and操作。按位and将返回在两者中设置的位。如果两个人一样,那么

(4294967296 & 0xFFFFFFFF00000000) == 4294967296 

(4294967296 & 0xFFFFFFFF00000000) == 0xFFFFFFFF00000000 

两个都会举行,但他们显然没有。

3

嗯......我不知道你为什么会得出你所做的结论,但4294967296是0x100000000。要写出易于阅读的十六进制中的按位AND ...

0x0000000100000000 & 
0x00000000FFFFFFFF = 
0x0000000000000000 

0x0000000100000000 & 
0xFFFFFFFF00000000 = 
0x0000000100000000 

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