有没有更好的方法在python中从十进制转换为二进制?

时间:2010-02-03 14:37:12

标签: python binary

我需要从一个整数转换为一个大小为8的列表,该列表是该数字的二进制表示(数字< = 255)并返回。目前我正在使用这些行

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 个答案:

答案 0 :(得分:4)

在Python 2.6或更高版本中,使用format syntax

'{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 guru Ned Batchelder使用Python和PIL进行了一些与隐写相关的实验here。你可以在那里找到一些有用的代码。

如果您发现需要更高的速度(并且仍希望使用Python编写代码),您可能需要考虑使用numpy

答案 1 :(得分:3)

您可以使用zfill代替rjust

list(bin(my_num)[2:].zfill(8))

答案 2 :(得分:1)

以下是一种十进制到二进制转换的方法:

  • 将十进制数除以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."

答案 3 :(得分:0)

我在这里给出了十进制到二进制转换的程序。

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