我需要从一个整数转换为一个大小为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次),所以速度很快。
答案 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)
以下是一种十进制到二进制转换的方法:
可以编码为:
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