2015-09-22 64 views
1

我有公式:(short)(0xF800 |(N & 0x7ff))。在C/CPP/C#的幫助下,我改變了八位數字的符號(例如1202數字-846)。在Python中,這個技巧是行不通的。我如何得到相同的結果?python中的位操作

+0

數量不是八位,它是11位!錯字 –

+0

你想要實現什麼目標?爲什麼你需要將高五位設置爲1?你是否意識到這一點,0xF800 | (N&0x7FF)== 0xF800 | N + – zstewart

回答

0

如果你想與C(++)類型工作,你將需要使用structctypes模塊

此方法使用結構爲整數包成字節串,則它解爲不同類型的。

>>> import struct 
>>> N = 1202 
>>> struct.unpack('h', struct.pack('H',0xf800|(N & 0x7ff)))[0] 
-846 

該方法使用具有類似於你在C什麼的內部表示ctypes的(++)

>>> from ctypes import c_short 
>>> N = 1202 
>>> c_short(0xf800|(N & 0x7ff)).value 
-846 
+0

什麼是更快? ctypes或結構? –

+0

性能可能並不是這裏的重要問題,因爲一旦你掌握了數據,你將如何處理這些數據。如果你只是一次轉換一個值,並且不需要寫出原始字節串,那麼ctypes就可以。否則,你可能想要結構。 –

0

也許有人會需要:

從ctypes的導入c_short C_short(0xF800 |(N & 0x7ff))。值

2

Python中的整數具有無限長度。要創建一個負數,您需要設置最高位,但Python沒有「頂級」 - 您無法通過位操作來完成此操作。你可以做的是將一個正數轉換爲負數與減法。

bits = 0xf800 | (N & 0x7ff) 
if bits & 0x8000: 
    bits -= 0x10000 

既然你已經知道了最高位設置,這將簡化:

bits = (0xf800 | (N & 0x7ff)) - 0x10000