在python中,有更好的方法将十进制转换为二进制吗?

3 投票
5 回答
2070 浏览
提问于 2025-04-15 18:50

我需要把一个整数转换成一个大小为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次),所以速度很重要。

5 个回答

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

你可以用 zfill 来代替 rjust

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

在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

另外,Stack Overflow的专家Ned Batchelder在这里做了一些与隐写术相关的实验,使用了Python和PIL,可以在这里找到。你可能会在那儿找到一些有用的代码。

如果你发现需要更快的速度(并且仍然想用Python编程),你可以考虑使用numpy库。

撰写回答