[英]Extracting runtime number of bits from integer
我需要從整數中提取一些位。 但是,要提取多少位並不確定。
例如,某個代碼正在生成2個數字a
和b
。 我想要的是可以執行的代碼
c = a[b-1:0]
我在網上讀到的一種方法是w說b是一個固定值3,一個簡單的方法是
c=bin (a >> 0 & 0b111 )
但這可以在b的值固定為3的情況下完成,例如,我們基於已知的固定位數對與進行右移,即3。
但是,如果“ 3”不固定怎么辦? 在運行時,我可能需要低4位或3位或2位...任何東西。
我想嘗試的東西是可行的
x = bin(a)
c= x[b-1:0]
但這甚至行不通。
從這個問題出發,目前尚不清楚您實際上想做什么,但據我了解,您想從“ a”中提取“ b”個最后位。 如果兩個數字分別是“ a”和“ b”:首先,將“ a”轉換為二進制: x = bin(a)[2:]
從a中提取最后b位: p = x[len(x)-b:]
您的某些代碼嘗試使用切片符號( [:]
)訪問整數的位,但僅適用於序列,不適用於整數。
首先,您需要確定是否要使用二進制數或整數表示形式的數字字符串表示形式,並保持一致。 讓我們從二進制的字符串表示開始。 a
是輸入數字, b
是位數。
>>> a = 35
>>> x = bin(a)
>>> x
'0b100011'
現在,您想要以二進制形式的字符串表示形式,該整數是該字符串的最右邊的b
位置:
>>> b = 3
>>> x[-b:]
'011'
剝奪其0b
前綴,此3位數字的字符串可能表示任何含義。 一些例子:二進制的3; 十進制的11; 在八進制9中; 在十六進制的17中。 我們通過閱讀代碼知道,它是bin()
調用輸出的一部分,但是字符串並未隨身攜帶該信息。 3位數字表示您想要表達的意思。
如果要將其轉換為可以進行算術運算的函數,則可以調用int()
將其轉換回整數。 但是因為int()
不能告訴我們該表示形式應該是二進制的,所以可以這樣做:
>>> int(x[-b:],2)
3
的2
作為第二個參數傳遞給int()
指定了基字符串被認為是在它不指定轉換 :它指定的解釋 。 它是可選的,但是如果省略它,則int()
將使用默認基數,當然是10。
>>> int(x[-b:])
11
發生這種情況是因為沒有任何底數指示, 011
表示“十一,前導零”。 然后int()
將字符串轉換為整數 :只是整數 ,而不是以10為基數的整數 。 當您要求解釋器顯示整數時,整數的內部表示形式只會轉換為以10為底的整數。 (在內部,Python整數實際上使用2 ** 30為底,但是我們大多數人都不必考慮那么多,我建議您也不要這樣。)
現在考慮只使用整數。 如果要屏蔽的位數為b
那么(如johnrsharpe指出的那樣),您可以使用(2**b - 1)
獲得相應的掩碼:
>>> 2**b - 1
7
只是為了證明這是您真正想要的:
>>> bin(2**b - 1)
'0b111'
然后,您可以使用按位&
運算符獲取所需的數字。 這與string方法有點相反:不是切掉您想要的3位數字,而是使用&
設置不想將其設為零的數字:
a = 100011
b = 000111 &
------
000011
然后,您可以直接獲取結果,而無需進行字符串轉換並進行切片並將其轉換回整數:
>>> a & 2**b - 1
3
如您所見,一步就可以得到相同的結果。 在您的問題中,我還看到了右移運算符>>
但是由於您將零位移位,所以它什么也沒做。 如果您還想接受移位量,例如s
,則在以上示例中,使用(a >> s)
代替a
。
如果您實際上想要整數值的(低) 位 :可以這樣做:
def getbits(value, numbits):
""" Extract the lower numbits of value. """
return value & (2 ** numbits - 1)
value = 0b010011000111
for i in range(value.bit_length()+1):
print('getbits({:012b}, {:2d}): {:12b}'.format(value, i, getbits(value, i)))
輸出:
getbits(010011000111, 0): 0
getbits(010011000111, 1): 1
getbits(010011000111, 2): 11
getbits(010011000111, 3): 111
getbits(010011000111, 4): 111
getbits(010011000111, 5): 111
getbits(010011000111, 6): 111
getbits(010011000111, 7): 1000111
getbits(010011000111, 8): 11000111
getbits(010011000111, 9): 11000111
getbits(010011000111, 10): 11000111
getbits(010011000111, 11): 10011000111
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.