Восьмибитные числа в питоне

Как преобразовать целое число в список бит в 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. Сделал из каталога репозиторий гит через гитбаш.

Источник

Читайте также:  Create class and object in java
Оцените статью