Есть ли лучший способ преобразовать из десятичного в двоичный в Python? - PullRequest
3 голосов
/ 03 февраля 2010

Мне нужно преобразовать целое число в список размера 8, который является двоичным представлением этого числа (число <= 255) и обратно. В настоящее время я использую эти строки </p>

list(bin(my_num)[2:].rjust(8,'0'))
int("".join(my_list),2)

Я немного погуглил, но с трудом нашел нужную информацию. Мне просто любопытно, есть ли более быстрый или более стандартный способ сделать это.

редактирование: Будет ли использование битовой маскировки сделать это быстрее. Например. как то так

[(my_num>>y)&1 for y in xrange(7,-1,-1)]

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

Ответы [ 4 ]

4 голосов
/ 03 февраля 2010

В Python 2.6 или новее используйте format синтаксис :

'{0:0=#10b}'.format(my_num)[2:]
# '00001010'

Одна из замечательных особенностей строк Python - это то, что они являются последовательностями. Если все, что вам нужно сделать, это перебрать символы, нет необходимости преобразовывать строку в список.

Редактировать : Для стеганографии вас может заинтересовать преобразование потока символов в поток битов. Вот как вы можете сделать это с генераторами:

def str2bits(astr):
    for char in astr:    
        n=ord(char)
        for bit in '{0:0=#10b}'.format(n)[2:]:
            yield int(bit)

И преобразовать поток битов обратно в поток символов:

def grouper(n, iterable, fillvalue=None):
    # Source: http://docs.python.org/library/itertools.html#recipes
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    return itertools.izip_longest(*[iter(iterable)]*n,fillvalue=fillvalue)

def bits2str(bits):
    for b in grouper(8,bits):
        yield chr(int(''.join(map(str,b)),2))

Например, вы можете использовать вышеперечисленные функции следующим образом:

for b in str2bits('Hi Zvarberg'):
    print b,
# 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1

# To show bits2str is the inverse of str2bits:
print ''.join([c for c in bits2str(str2bits('Hi Zvarberg'))])
# Hi Zvarberg

Кроме того, SO гуру Нед Бэтчелдер проводит некоторые связанные с стеганографией эксперименты с использованием Python и PIL здесь . Вы можете найти там полезный код.

Если вам нужно больше скорости (и вы все еще хотите кодировать это на Python), вы можете использовать numpy .

3 голосов
/ 03 февраля 2010

Вы можете использовать zfill вместо rjust.

list(bin(my_num)[2:].zfill(8))
1 голос
/ 02 февраля 2016

Вот один из методов преобразования десятичных чисел в двоичные:

  • разделите десятичное число на 2
  • возьмите остаток и запишите его на стороне
  • разделите частное на 2
  • повторять до тех пор, пока десятичное число не может быть разделено далее
  • запишите остаток в обратном порядке, и вы получите результирующее двоичное число

Который может быть закодирован как:

d=int(raw_input("enter your decimal:"))
l=[]
while d>0:
    x=d%2
    l.append(x)
    d=d/2
l.reverse()
for i in l:
    print i,
print " is the decimal representation of givin binary data."
0 голосов
/ 12 января 2012

Я дал здесь программу для преобразования десятичных в двоичные.

print "Program for Decimal to Binary Conversion"

n = 0
bin = 0
pos = 1

print "Enter Decimal Number:", 
n = input()

while(n > 0):
   bin = bin + (n % 2) * pos;
   n = n / 2;
   pos *= 10;

print "The Binary Number is: ", bin       

#sample output
#Program for Decimal to Binary Conversion
#Enter Decimal Number: 10
#The Binary Number is: 1010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...