Конкретный байт Python 2.7 - PullRequest
0 голосов
/ 06 июня 2019

У меня есть два целых числа одного байта, поэтому каждое целое число может быть в диапазоне 0-255.Предположим,

    a = 247
    b = 8

Теперь двоичное представление каждого из них:

   a = 11110111
   b = 00001000

. Мне нужны следующие операции:

1) Конкат этих двух двоичных последовательностей, поэтомуследуя примеру, "a" concat "b" приведет к:

 concat = 1111011100001000 -> that is 63240

2) Рассмотрим только первые n наиболее значимых битов, предположим, что первые 10 битов будут повторяться в:

 msb = 1111011100000000

3) Измените порядок битов, это приведет к:

 reverse = 0001000011101111

Для вопроса № 2 я знаю, что это всего лишь операция сдвига, для 3-х, которые я догадался преобразовать в шестнадцатеричное, затем поменять местами, а затем преобразовать в целое число, но я думаю также, что есть более элегантный способ.

Для числа 1 я написал это решение, но я ищу что-то более элегантное и производительное:

 a = 247
 b = 8

 first = hex(a)[2:].zfill(2)
 second = hex(b)[2:].zfill(2)

 concat = int("0x"+first+second,0)

Спасибо

1 Ответ

1 голос
/ 06 июня 2019

Эти операции являются основными битовыми манипуляциями, за исключением последнего шага:

  1. 247, сдвиг влево на 8 бит (= перейти к старшему байту)
  2. оставить 8 как есть (= младший байт)
  3. добавить эти результаты
  4. бит и с маской, которая обнуляет последние 6 бит
  5. обратный порядок битов (не битовая операция; больше методов здесь )

В Python 2.7 код:

a = 247 << 8
print "a = {0: >5} - {1:0>16}".format(a, bin(a)[2:])

b = 8
print "b = {0: >5} - {1:0>16}".format(b, bin(b)[2:])

c = a + b
print "c = {0: >5} - {1:0>16}".format(c, bin(c)[2:])

d = c & ~63  # 63 = 111111, ~63 is the inverse
print "d = {0: >5} - {1:0>16}".format(d, bin(d)[2:])

e = int('{:08b}'.format(d)[::-1], 2)
print "e = {0: >5} - {1:0>16}".format(e, bin(e)[2:])

выход

a = 63232 - 1111011100000000
b =     8 - 0000000000001000
c = 63240 - 1111011100001000
d = 63232 - 1111011100000000
e =   239 - 0000000011101111
...