Python bitstring Uint рассматривается как долго

Совершенно новый для Python и, кажется, застрял, у меня есть следующее:

Я прочитал 30 бит из потока битов:

MMSI = b.readlist('uint:30')

Кажется, это работает нормально, за исключением случаев, когда значения становятся выше.

MMSI = b.readlist('uint:30')
p = 972128254
# repr(MMSI)[:-1]
print p
print "MMSI :"
print MMSI
if MMSI == p:

Код выше выводит:

972128254
MMSI :
[972128254L]

Целое, если MMSI ==p: пропущено, по какой-то причине не равно. Я не понимаю, почему значение, которое намного ниже, чем max.int:

>>> import sys
>>> sys.maxint
2147483647

Я не понимаю, почему я вернул Лонг, а не уинт? Если возвращаемое значение 244123456, оно работает как шарм.

Что мне здесь не хватает?

спасибо за преимущество,

дебошир

3 ответа

2147483647 это maxint, но int это 32 бита, а вы используете 30 бит. Таким образом, ваш максимум составляет 1/4 от этого, или около 500 миллионов.

Значения будут "длинными", если промежуточное значение было длинным. Так например 2**1000 / 2**999 будет равно 2L, Это просто связано с внутренностями метода, который вы вызвали, и не должно влиять на большую часть кода.

Реальная проблема заключается в том, что вы сравниваете в своем коде сравнение int со списком, а это не то, что вы хотите делать. Вы можете использовать read метод, а не readlist чтобы вернуть один элемент или взять первый элемент возвращенного списка: if MMSI[0] == p:

Ага, я подумал, что если я прочитаю 30 бит и верну его как значение uint, это автоматически будет значением 32 бита. Итак, вы говорите, что мне нужно добавить начальные нули, чтобы получить 32-битное значение, и тогда оно должно работать. Вот что я испытал, и теперь я потерян.

Я решил, что давайте закодируем значение, с которым я хочу сравнить, таким же образом. Так вот что я сделал:

  from bitarray import bitarray
  from bitstring import BitArray, BitStream,pack
  from time import sleep
  import string

  MMSI = b.readlist('uint:30')
  x = pack('uint:30',972000000)
  p = x.readlist('uint:30')
  y = pack('uint:30',972999999)
  q = y.read('uint:30')
  print p
  print q
  print x
  print y
  print MMSI

в результате чего:

 p = [972000000L]
 q = 972999999
 x = 0b111001111011111000101100000000
 y = 0b111001111111101100110100111111
 MMSI = [972128254L]

Как может быть так, что более высокое значение 972999999 не длинное?

Другие вопросы по тегам