我有32位數字A=0x0000000A
和B=0X00000005
。在Python中將數字轉換爲32位
我通過A^B
得到一個xor B,它給出0b1111。
我旋轉了這個並得到了D=0b111100000
,但我希望這是32位數字不僅用於打印,但我需要MSB位,即使在這種情況下有0進行進一步操作。
我有32位數字A=0x0000000A
和B=0X00000005
。在Python中將數字轉換爲32位
我通過A^B
得到一個xor B,它給出0b1111。
我旋轉了這個並得到了D=0b111100000
,但我希望這是32位數字不僅用於打印,但我需要MSB位,即使在這種情況下有0進行進一步操作。
大多數高級語言都沒有ROR/ROL運營商。有兩種方法可以解決這個問題:一種方法是添加一個外部庫,如ctypes或https://github.com/scott-griffiths/bitstring,它們支持循環或bitlice整數支持(這很容易添加)。
要記住的一件事是Python是'無限'的精度 - 那些MSB總是0爲正數,1爲負數; python存儲儘可能多的數字,因爲它需要保持與默認值的最大幅度差異。這就是你在python中看到怪異符號的一個原因,就像〜(0x3)顯示爲-0x4,這在二進制補碼錶示中是等效的,而不是等價的正值,但-0x4總是總是是真的,即使你和它對一個5000位的數字,它只會掩蓋底部的兩位。
或者,你可以做你自己,大家都習慣的方式,以及如何與硬件的實際做的:
def rotate_left(number, rotatebits, numbits=32):
newnumber = (number << rotatebits) & ~((1<<numbits)-1)
newnumber |= (number & ~((1<<rotatebits)-1)) << rotatebits
return newnumber
嘿,我得到了旋轉部分覆蓋。謝謝。我有號碼0b111100000,但我想要32位,我必須使用第24位和第32位,在這種情況下爲0,並執行一些操作。 –
打印所有32位可能需要一些額外的工作。但是位24和位31實際上存在;你仍然可以通過例如'(number&(1 << 24))!= 0'。 –
好吧,我明白你在說什麼。但看看我的問題。我有說D = 0b111100000這是打印爲480.現在這個沒有。 D實際上是32位。我想把這個數字的第24,第0和第32位取代並用這個位替換D的MSB並得到一個新的數字E.我可以像你說的那樣訪問那些位,但是我不能將結果代入MSB –
bin(i)[2:].zfill(32)
我猜你想要做什麼。
我覺得這裏你更大的問題是,你是誤會了一些和它表示的區別
12^18 #would xor the values
56 & 11 # and the values
,如果你需要實際的32位有符號整數,則可以使用numpy的
a =numpy.array(range(100),dtype=np.int32)
好吧,我明白你在說什麼。但看看我的問題。我已經說了D = 0b111100000這是打印爲480.現在這沒有D實際上是32位。我想把這個數字的第24,第0和第32位取代並用這個位代替D的MSB並得到一個新的數字E.和Corley說的一樣,我能夠訪問這些位,但是我不能把結果代入MSB –
「我需要MSB位,即使在這種情況下有0進一步操作「:這是什麼意思? –