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

cygmwpex  于 2023-01-08  发布在  Python
关注(0)|答案(5)|浏览(148)

我需要将整数转换为大小为8的列表,即该数字的二进制表示(number〈= 255),然后再转换回来。

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

我搜索了一下,但是很难找到相关的信息。我只是好奇是否有更快或更标准的方法来做到这一点。

**edit:**使用位屏蔽是否会使其更快。例如,类似于以下内容

第一个月
就像我在评论中提到的,我正在为我正在编写的一个隐写应用程序使用这个,所以我正在这样做数千次(图像中每个像素3次),所以速度不错。

gzszwxb4

gzszwxb41#

在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大师Ned Batchelder使用Python和PIL here做了一些与隐写术相关的实验,您可能会在那里找到一些有用的代码。
如果您发现需要更快的速度(并且仍然希望用Python编写代码),您可能希望考虑使用numpy

kt06eoxx

kt06eoxx2#

您可以使用zfill代替rjust

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

tv6aics13#

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

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

2skhul334#

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

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
vecaoik1

vecaoik15#

第一种溶液

快速方法不能使用循环。
我建议使用一个查找表,您可以构建一次,并根据需要经常使用。

tb = []
for i in range(256):
  tb.append( f"{i:08b}")
# once build you can use it for the whole image.
print( tb[27]) # will print: 00011011

第二种溶液

但是如果你真的很在乎速度,你就不应该使用字符,你应该用字节数组(它是可变的)来加载你的图像,然后直接修改像素中的位。

img[2][8] |≃ 0b10 # set second bit from right
img[2][8] |= 1<<1 # same
img[2][8] &= ~0b10 # reset second bit
img[2][8] &= ~1<<1 # same
img[2][8] ^= 0b1010  # invert second and fourth bits

相关问题