2016-10-10 35 views
2

我正在使用itertool函數將值輸入到列表中。 itertool函數將該值作爲str,而不是int。之後,我需要將列表中的值轉換爲其二進制等值。當我需要轉換一個負值時會出現問題,例如-5。我的代碼將「 - 」作爲str,但我需要它在下面的數值之前將其視爲負號。無符號整數的概念是否起作用?如何將帶符號的字符串轉換爲Python中的二進制等價物?

我的代碼是 -

L3= list(itertools.repeat("-1",5)) 

file= open(filename, 'w') 

L3_1=[ ] 

for item in L3: 

     x3=bytes(item,"ascii") 
     L3_1.append(' '.join(["{0:b}".format(x).zfill(8) for x in x3])) 

for item in L3_1: 

     file.write("%s\n" % item) 

file.close() 
+1

預期結果是什麼?二進制的絕對值?一些預期的輸入/輸出將是有用的 – brianpck

+0

是的,我需要在二進制的絕對值。如果輸入= -5,那麼輸出應該是= 11111011 – rrra

+0

這不是'abs(-5)'的二進制數......「 – brianpck

回答

0

這不是完全清楚你的問題是什麼,你想達到什麼,所以請糾正我,如果我做出錯誤的假設。

無論如何,將整數轉換爲二進制表示很容易使用bin完成。例如,bin(5)給你'0b101'。現在,bin(-5)爲您提供了'-0b101'--這不是您在用其他語言的二進制文件時所期望的,例如, C.

「問題」是python中的整數是而不是固定大小。沒有int16,int32uint8等等。 Python會根據需要添加比特。這意味着負數不能其補充表示 - 0b11111011-5作爲int8,但251由於二進制文件可能是無限的,沒有固定的位置放置一個符號位。因此,python必須添加明確的一元-。這是不同來自-5的解釋字符串"-""5"

如果你想得到負數的二進制表示,固定大小的整數,我認爲你必須自己做。某個功能,這可能看起來像這樣的:

def bin_int(number, size=8): 
    max_val = int('0b' + ('1'* (size - 1)), 2) # e.g. 0b01111111 
    assert -max_val <= number <= max_val, 'Number out of range' 
    if number >=0: 
     return bin(number) 
    sign = int('0b1' + ('0' * size), 2) # e.g. 0b10000000 
    return bin(number + sign) 

現在,做你最初想:寫數字的二進制表示的文件。

output_list = [1, -1, -5, -64, 0] # iterable *containing* integers 
with open(filename, 'w') as output_file: # with statement is safer for writing 
    for number in output_list: 
     output_file.write(bin_int(number) + '\n') 

或者,如果你只是想檢查結果:

print([bin_int(number) for number in [1, -1, -5, -64, -127]]) 
# ['0b1', '0b11111111', '0b11111011', '0b11000000', '0b10000001'] 

注意,如果你想要去除的0b,你能做到這一點通過bin_int(number)[2:],例如output_file.write(bin_int(number)[2:] + '\n')。這將從保存二進制表示的字符串中移除前兩個字符。

+0

很多很多謝謝 – rrra

相關問題