在python中,有更好的方法将十进制转换为二进制吗?
我需要把一个整数转换成一个大小为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库。