2013-12-12 27 views
1

我在THUMB(ARM指令集)中使用了lsl和lsr,它們的工作方式與寄存器中的位數有關。我可以設置特定的位數來保持Python的邏輯轉換嗎?

在我的特殊情況下,正好是16位寄存器,但是這不是太重要,例如的目的,我會假裝他們只有4位。

基本上,他們的行爲是這樣的:

mov r0, #0x1011 
lsl r0, #0x1 

的MOV將設置r0至1000,然後LSL將轉移他們,而是因爲裏面R0數量已經4位,並且,正如我剛纔所說我們假裝我們正在處理4位寄存器,該位丟失,並且r0將變爲#0x0110。

基本上發生的是,對於某些東西是n位,n個最重要的位丟失,其餘的值如預期的那樣移位,並且0被添加以填充最低有效位。

這可能有一個名字,對不起,我不知道它是什麼,但希望是什麼,我指的是非常明顯的。

我可以用Python的< <運營商的工作,我需要這樣的事情發生。實際上,我需要分裂出一個16位數字轉化成其最顯著3位,下一個最顯著2位等

有一個簡單的方法來處理這一個已經建成的Python?我知道一個辦法做到這一點,但不是與困擾,我想這將會是值得懷疑這樣的一個功能是內置的。

感謝。

回答

1

執行此操作最麻煩的方法可能是使用明確的位掩碼,例如

a = (sixteen_bit_val & 0xE000) >> 13 
b = (sixteen_bit_val & 0x1800) >> 11 
# ... and so on .. 

未經測試,轉換數量可能會減少一個或兩個。

+0

這是一個右移,而不是左移。 –

+0

@MarkRansom是的,是的。 OP說他想「將一個16位數字分成......」你將一個數字分成右邊的位域,而不是左移。我只能假設前面提到的彙編語言代碼使用左移,然後右移而不是掩蔽。 – zwol

+0

@Zack - 是的。例如,爲了獲得第四和第五位,這個想法是使用lsl去除最重要的位,並且使用lsr。 – Kevin

0

如果你只是想保留位的設置數量,使用遮罩and那些位。

>>> bin((0b1011 << 1) & 0b1111) 
'0b110' 
1

如果你是在轉移和掩蓋困難方面找到位操作,您可能需要將其包裝起來熟悉的術語,例如,與就像位序列的一類,並且可切片等

或者,更好的是,你可能想要得到一個包裝,爲你做這個,如bitarraybitstring

然後,你可以這樣寫代碼:

>>> bin[13:16] 
bitarray('010') 
>>> bin[11:13] 
bitarray('11') 

...等在幕後它可能仍然移位和屏蔽整數(儘管對於您所關心的可能是用C而不是Python的),但你不必用這些術語思考。

雖然我們在這,但您沒有提到任何關於排序的內容。如果你希望它是native-endian,或者明確的big-endian或類似的東西,那麼當你做手動移位和屏蔽操作時,這是非常隱含的。通過將數字轉換爲字節字符串,然後將其轉換爲位字符串,可能會更好。例如:

n = int(input()) 
b = struct.pack('!H', n) # explicitly network-endian 
bb = bitarray(16) # explicitly 16 bits 
bb.frombytes(b) 
bb[13:16] 
相關問題