2010-02-03 22 views
3

我需要從一個整數轉換爲大小爲8的列表,該列表是該數字(數字< = 255)的二進制表示並返回。目前我正在使用這些行有沒有更好的方法在Python中從十進制轉換爲二進制?

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

我做了一些Google搜索,但很難找到相關信息。我只是好奇,如果有更快,或更標準的方式來做到這一點。

編輯: 會使用位掩碼使其更快。例如。像這樣

[(my_num>>y)&1 for y in xrange(7,-1,-1)]

就像我在評論中提到我用這對隱寫術的應用程序我寫,所以我這樣做上千次(每像素3倍的圖像中),所以速度很好。

+0

這就像第四屆「我怎麼轉換成二進制」本週(主要是在不同的語言),我們已經有問題,什麼是**向上**?這是功課嗎? (這不是批評,我只是感到驚訝;將數字轉換爲二進制表示在一般編程中沒有那麼多......) –

+0

我會說不,但有人可能會糾正我。我不確定一個>>循環是否會比bin()更快,但你不需要rjust() –

+0

這不是家庭作業。我正在研究一個隱寫術應用程序。這可能不是最好的方式,但它是明顯的方式。 –

回答

4

在Python 2.6或更高版本,使用formatsyntax

'{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 

也,所以大師Ned Batchelder不使用Python和PIL here一些隱祕相關的實驗。您可能能夠在那裏找到一些有用的代碼。

如果你發現你需要更多的速度(並且仍然希望用Python編碼),你可能需要使用numpy

+0

是的,但爲了改變一個元素,我需要一個正確的列表?字符串是不可變的。 –

+0

感謝指向隱寫術的東西。我儘量避免在python中查看其他隱寫術文章,因爲我想讓這個應用成爲我的應用。我害怕如果我看看其他人的解決方案,他們的想法會滑入我的代碼中,而我卻找不到自己的解決方案。我有一個工作的應用程序,它工作得很好,我只是想做一些改進。 –

3

您可以使用zfill而不是rjust

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

謝謝,我在搜索中錯過了這個功能。 –

+0

我嘗試在我的應用中使用這一行替換上面發佈的位掩碼解決方案,它給我提供了約20%的平均改進。 zfill在調整方法上平均提高了約2%,但在最壞的情況下提高了12%。當然,所有這些數據都是針對我的特定應用程序的,所以我不知道它是否具有普遍性,但對我來說已經足夠了! –

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 
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." 
+1

歡迎來到SO並感謝您發佈答案。請重新格式化您的答案。正如所寫的,它看起來像胡言亂語。 –

+0

@RichardErickson其實我是新的,所以沒有得到如何張貼正確的縮進 – cryptolock

+0

請參閱幫助文件:http://stackoverflow.com/help/formatting –

相關問題