Python 2.2: как получить младшие 32 бита из 64-битного числа? - PullRequest
1 голос
/ 24 января 2009

У меня есть 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 битам.

Я что-то упустил здесь?

Спасибо!

1012 * Матфей *

Ответы [ 4 ]

4 голосов
/ 24 января 2009
>>> 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.

Для вашей информации, я задал какой-то связанный вопрос некоторое время назад.

2 голосов
/ 26 января 2009

Мэтью, я заметил, что пропустил одну информацию, я использую Python версии 2.2.3. Мне удалось попробовать это на другой машине с версией 2.5.1, и все работает, как ожидалось. К сожалению, мне нужно использовать более старую версию.

В любом случае, спасибо всем за ваши ответы. Добавление 'L', кажется, делает свое дело, и это одноразовый, поэтому я чувствую себя комфортно с таким подходом.

Спасибо

Мэтью

2 голосов
/ 24 января 2009

Вам нужно использовать длинные целые числа.

foo = 0xDEADBEEFCAFEBABEL
fooLow = foo & 0xFFFFFFFFL
0 голосов
/ 24 января 2009

Очевидно, что если оно одноразовое, то использование длинных целых чисел с добавлением буквы «L» к вашим литералам - быстрый ответ, но для более сложных случаев вы можете обнаружить, что можете написать более понятный код, если посмотрите на Имеет ли Python тип битового поля? , поскольку именно так вы, похоже, используете свои битовые маски.

Я думаю, что мои личные предпочтения, вероятно, будут http://docs.python.org/library/ctypes.html#ctypes-bit-fields-in-structures-unions, поскольку он находится в стандартной библиотеке и имеет довольно четкий API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...