2017-02-11 63 views
0

我正試圖解決this站點上的問題。除了無法正確地將位串轉換爲其32位有符號整數表示形式外,我的一切都正確。將bitstring轉換爲32位有符號整數會產生錯誤的結果

例如,我有這樣的比特串:我部分從學校請記住,第一位爲符號位:

block = '10101010001000101110101000101110' 

我這個位串轉換爲32位有符號整數的自己的路。如果它是1,我們有負數,反之亦然。

我這樣做的時候,它給了我它只是將它轉換爲10進制以10爲底數的數字:即檢查後

int(block, 2) #yields 2854414894 

我試圖排除的第一位,並轉換其餘31位串的長度,第一位來決定這是否是負數或不是:

int(block[1:32], 2) #yields 706931246 

但正確答案是-1440552402。我應該怎麼做這個bitstring得到這個整數?如果系統的字節順序是小端或大端,它是否相關?我的系統是小端。

+0

到http://stackoverflow.com/questions/1375897/how-to-get-the-signed-integer-value-of-a-long-in-python類似 –

回答

2

你說得對,高位確定符號,但它不是一個簡單的標誌。相反,負數的整個特徵是倒置的。這是一個正數1(在8位):

00000001 

這是一個負1:

11111111 

其結果是,加法和減法 「環繞」。所以4 - 1將是:

0100 - 0001 = 0011 

所以0 - 1是一樣的1_0000_0000 - 1.「借」剛剛熄滅的整數上方。

「否定」數字的一般方法是「反轉位,加1」。這兩種方式都有效,所以你可以從正面到負面並返回。

在你的情況下,使用前導'1'來檢測是否需要否定,然後轉換爲int,然後執行否定步驟。但是請注意,因爲python的int不是的固定寬度值,所以有一個單獨的內部標誌(Python int不是一個「32位」數字,它是一個任意精度的整數,存儲了動態分配的表示除了簡單的2補碼以外的其他方式)。

block = '10101010001000101110101000101110' 
asnum = int(block, 2) 
if block[0] == '1': 
    asnum ^= 0xFFFFFFFF 
    asnum += 1 
    asnum = -asnum 

print(asnum) 
+0

它解決了我的問題。謝謝。但是,爲什麼我們異或'asnum'?你能解釋一下嗎? – Bora

+0

用FFFF(全部1位)對數字進行異或將數據反轉。 1變爲0,0變爲1. –

+0

哦,我明白了。它是補充。難道我們只是使用'〜'運算符來做這件事? – Bora

3

在Python中沒有整數的大小,所以你永遠不會得到一個高位1位的負值。

要 「效仿」 32位行爲,只是這樣做,因爲你的2854414894值>2**31-1又名0x7FFFFFFF

print(int(block[1:32], 2)-2**31) 

你會得到

-1440552402 
2

您應該檢查時,輸入值超出32位有符號整數的正範圍:

res = int(block, 2) 
if res >= 2**31: 
    res -= 2**32 

因此,首先將數字解釋爲無符號的數字,但是當您注意到符號位已設置(> = 2^31)時,您將減去2^32以獲得負數。

相關問題