Как преобразовать целое число в список бит в Python
Я хотел бы знать, есть ли лучший способ сделать это, чем мой текущий метод.
Я пытаюсь представить целое число как список бит и оставить его до 8 бит , только если целое число равно < 128
Example input: 0x15 Desired output: [0, 0, 0, 1, 0, 1, 0, 1]
Я делаю это следующим образом:
input = 0x15 output = deque([int(i) for i in list(bin(input))[2:]]) while len(output) != 8: output.appendleft(0)
Есть ли лучший способ сделать это в python?
EDIT:
Я хотел бы преобразовать любое целое число в двоичный список. Pad до 8, только если для этого требуется меньше 8 бит.
Another Example input: 0x715 Desired output: [1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]
input = 0x15 output = [int(x) for x in ''.format(input)]
‘.format(0x15) представляет ваш формат input в binary с 0 padding до 8 цифр, а затем с использованием определения списка для создания списка бит.
В качестве альтернативы вы можете использовать функцию map :
output = map(int, [x for x in ».format(0x15)])
EDIT: ширина переменной ширины,
Если вы хотите сделать число битов переменной, это один из способов:
width = 8 #8bit width output = [int(x) for x in 'b>'.format(0x15,size=width)] output = map(int, [x for x in 'b>'.format(0x15,size=width)])
Это было протестировано в Python 2.7
Для фиксированного размера 8 бит:
num = 0x15 out = [1 if num & (1
Для чисел произвольного размера:
import math num = 0x715 bits = int(max(8, math.log(num, 2)+1)) out = [1 if num & (1
>>> [int(n) for n in bin(0x15)[2:].zfill(8)] [0, 0, 0, 1, 0, 1, 0, 1]
Срез [2:] должен удалить префикс 0b , zfill(8) – это нулевые лепестки.
Это легко сделать с помощью строк формата
>>> "".format(0x15) '00010101' >>> "".format(0x151) '101010001' >>> "".format(0x1511) '1010100010001'
для преобразования в список
>>> [1 if x=='1' else 0 for x in "".format(0x15)] [0, 0, 0, 1, 0, 1, 0, 1] >>> [1 if x=='1' else 0 for x in "".format(0x1511)] [1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
Скорее всего, это будет быстрее, если использовать бит twiddling, как в ответе @Amber, но тогда вам придется проверять наличие особых случаев и в итоге получить довольно много кода. Если максимальная производительность не требуется, безопаснее использовать то, что вы уже знаете.
Вы можете сдвинуть число шагов x вправо, а затем сделать побитовое, а результат – 1, чтобы получить бит в позиции x , сделайте это со списком и получите свой список. Если вам нужно поддерживать отрицательные числа, нам может понадобиться добавить в список нулевой список, чтобы гарантировать, что положительные числа не начинаются с 1:
import math def bits(n): # The number of bits we need to represent the number num_bits = max(8, int(math.log(abs(n), 2)) + 1) # The bit representation of the number bits = [ (n >> i) & 1 for i in range(num_bits) ] bits.reverse() # Do we need a leading zero? if n < 0 or bits[0] == 0: return bits return [0] + bits # Examples for n in (-0x15, 0x15, 128, 255, 256, -256): print("= <>".format(n, bits(n)))
-21 = [1, 1, 1, 0, 1, 0, 1, 1] 21 = [0, 0, 0, 1, 0, 1, 0, 1] 128 = [0, 1, 0, 0, 0, 0, 0, 0, 0] 255 = [0, 1, 1, 1, 1, 1, 1, 1, 1] 256 = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] -256 = [1, 0, 0, 0, 0, 0, 0, 0, 0]
from math import ceil input = 0x15 bin_string = bin(input)[2:] binary = map(int,bin_string.zfill(int(ceil(len(bin_string)/8.0)*8))) print(binary)
Это будет округлено до ближайшего кратного 8, если вы хотите округлить до кратного 8, только если < 128, используйте простой оператор if else и удалите zfill в else
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]
Если вы хотите добавить нули, если меньше 128, используйте это:
input = 0x715 bin_string = bin(input)[2:] num_bits = (8 if input < 128 else 0) binary = map(int,bin_string.zfill(num_bits)) print(binary)
Восьмибитные числа в питоне
Всем доброго здоровичка! Задача такая:
1) Строится восьмибитная двоичная запись числа N.
2) Удаляется последняя цифра двоичной записи.
3) Запись «переворачивается», то есть читается справа налево.
4) Полученное число переводится в десятичную запись и выводится на экран.
Делаю так, всё работает:
x=123 s=bin(x)[2:] s1=s[:-1] s2=s1[::-1] a=int(s2,2) print(x,s,s1,s2,a)
Но если делаю в цикле :
for x in range(1,100):
и т.д.
выдаёт ошибку:
a=int(s2,2)
ValueError: invalid literal for int() with base 2: ''
Можете объяснить почему и как это можно исправить. Спасибо.
Задача 3: перевод числа записанное в HEX с учетом знака в BIN
3) Напишите программу, которая переводит число (возможно, отрицательное), записанное в.
print('current\bin')
Почему команда print('current\bin') Выводит: currentin Как нормально сделать ? Чтобы выводил.
Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2
Подскажите как решить проблему с Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2 в 3.
Почему в качестве интрепретатора в Pycharm я не могу выбрать питон из папки bin
Здравствуйте, я создал пустой проект в Pycharm. Сделал из каталога репозиторий гит через гитбаш.