Python 2.2:如何从64位数中得到低32位?

时间:2009-01-23 22:52:19

标签: python

我有64位数字由各种位字段组成,我正在编写一个简单的python实用程序来解析数字。我面临的问题是低32位由一个场组成,并且使用位移或位掩码的某种组合不仅仅给出32位。

big_num = 0xFFFFFFFFFFFFFFFF
some_field = (big_num & 0x00FFFF0000000000) # works as expected
field_i_need = big_num & 0x00000000FFFFFFFF # doesn't work  

field_i_need等于big_num,而不是低32位。

我在这里错过了一些简单的东西吗?

谢谢!

马修

4 个答案:

答案 0 :(得分:4)

>>> big_num = 0xFFFFFFFFFFFFFFFF
>>> some_field = (big_num & 0x00FFFF0000000000) # works as expected
>>> field_i_need = big_num & 0x00000000FFFFFFFF # doesn't work
>>> big_num
18446744073709551615L
>>> field_i_need
4294967295L

似乎有效,或者我错过了这个问题。无论如何,我正在使用Python 2.6.1。

为了您的信息,我在一段时间之前询问了一些与之相关的question

答案 1 :(得分:2)

您需要使用长整数。

foo = 0xDEADBEEFCAFEBABEL
fooLow = foo & 0xFFFFFFFFL

答案 2 :(得分:2)

马修在这里,我注意到我遗漏了一条信息,我使用的是python 2.2.3版本。我设法在版本2.5.1的另一台机器上尝试这一点,一切都按预期工作。不幸的是我需要使用旧版本。

无论如何,谢谢大家的回复。附加'L'似乎可以解决问题,这是一次性的,所以我对这种方法感到满意。

谢谢,

马修

答案 3 :(得分:0)

显然,如果它是一次性的,那么通过在文字中附加'L'来使用长整数是快速的答案,但对于更复杂的情况,你可能会发现如果你看{{{{{{{ 3}}因为这就是你使用bitmasks的方式。

我认为我的个人偏好可能是Does Python have a bitfield type?,因为它在标准库中,并且有一个非常清晰的API。