Вычисление 16-разрядного целочисленного значения из двух 8-разрядных целых чисел?
чтобы проиллюстрировать, что я имею в виду: в шестнадцатеричном редакторе у меня есть 8C 01
что это 396
прямой порядок байтов. Данные, с которыми я работаю,-это кортеж с двумя отдельными 8-битными целыми числами i = (140, 1)
.
чтобы вычислить 16-битное значение, мой первый подход состоял в том, чтобы просто умножить 2-е целое число на 255, а затем добавить первое. Однако этот метод просто неправильный, поскольку он не дает правильного значения (из-за моего отсутствия знаний). Может ли кто-нибудь предложить лучший (возможно, Питонический) подход?
2 ответов
вам нужно умножить его на 256 (28). Таким образом, функция будет чем-то вроде:
def pack (tup) :
return 256*tup[1]+tup[0]
или побитовый сдвиг, который имеет больше смысла при работе с битами:
def pack(tup) :
return (tup[1]<<8)|tup[0]
здесь <<
означает, что вы размещаете значение tup[1]
восемь позиций влево. Трубка (|
) означает, что вы выполняете операцию OR. Это разумно, если вы применяете значения в кортежах меньше 256
и может - по крайней мере теоретически-привести к некоторому ускорению.
более универсальный
если ваш кортеж имеет произвольную длину (например, три, четыре или более элементов), вы можете определить более общую функцию:
def pack(tup) :
sum = 0
for i in range(len(tup)) :
sum |= tup[i]<<(i<<3)
return sum
здесь <<3
используется в качестве ярлыка для умножения с 8
, поэтому эквивалентная функция будет:
def pack(tup) :
sum = 0
for i in range(len(tup)) :
sum |= tup[i]<<(8*i)
return sum
или написано, что-то вроде:
tup[0]|(tup[1]<<8)|(tup[2]<<16)|(...)
вы должны умножить на 256...
>>> i[1]*256 + i[0]
396
существует способ Python с использованием struct
модуль, но не надо в таком простом случае.
>>> from struct import pack, unpack
>>> unpack('<H', pack('BB', *i))[0]
396