2017-10-07 25 views
-1

後,這是我的代碼:刪除「 - 」二元運算

with open("bin.bin", "rb") as file: 
    content=file.read() 
    binary = bin(int(binascii.hexlify(content), 16)) 
    binary = ' '.join('{0:08b}'.format(ord(x)-128, 'b') for x in content) 
    print binary 

我輸出的格式爲:

01100111 -1001001 00011110 

我怎樣才能擺脫「 - 」和替換它0?

+1

你可能想'(ord(x)+ 128)%256'?但不清楚爲什麼你會想要這樣的事情。 – o11c

回答

2

如果你想真正得到位權(而不是僅僅試圖中心區域的值),你需要一個不同戰略。 -1001001實際上是-73。對於一個8位的數量,這樣做的二進制補碼的版本實際上是10110111,可呈現就是下面的功能:

def convert_num(num, bits=8): 
    if num >= 0: 
     return num 
    mask = (1 << bits) - 1 
    return ((-1 * num)^0xFF) + 1 

binary = ' '.join('{0:08b}'.format(convert_num(ord(x)-128), 'b') for x in content) 

但是,如果你正在閱讀是指待簽名數據,然後您可以使用struct.unpack()將數據轉換:

binary =' '.join('{0:08b}'.format(struct.unpack('b', x)[0], 'b') for x in content) 

或者你可以使用它代替:對你要什麼ACHI

def to_signed_char(x): 
    if x >= 128: 
     return x - 256 
    return x 

binary = ' '.join('{0:08b}'.format(to_signed_char(x), 'b') for x in content) 

這真的取決於在這裏等。

0

我的不好,只是找到了答案,只是增加了ABS()

binary =' '.join('{0:08b}'.format(abs(ord(x)-128), 'b') for x in content) 
+2

您是否意識到您不是以二進制表示相同的數量? – jszakmeister

+0

你是什麼意思? – amintou

+1

我的意思是你代表-73作爲'01001001',它與73相同。二進制補碼版本(signed char)將是'10110111'。 – jszakmeister