我需要从整数中提取一些位。但是,要提取多少位并不确定。
例如,某个代码正在生成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]
但是即使这样也不起作用。
答案 0 :(得分:0)
从问题上说,您实际上想做什么并不清楚,但据我了解,您想从“ a”中提取“ b”个最后一位。
如果两个数字分别是“ a”和“ b”:
首先,将“ a”转换为二进制:
x = bin(a)[2:]
从a中提取最后b位:
p = x[len(x)-b:]
答案 1 :(得分:0)
您的某些代码正在尝试使用切片符号([:]
)访问整数的位,但这仅适用于序列,不适用于整数。
首先,您需要确定是否要使用二进制的数字表示形式或整数表示形式,并保持一致。让我们从二进制的字符串表示开始。 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
的{{1}}指定了字符串应位于的基数。它没有指定转换:它是指定解释。它是可选的,但是如果您忽略它,那么int()
将使用默认的基数,当然是10。
int()
之所以发生这种情况,是因为没有任何底数的指示,>>> int(x[-b:])
11
的意思是“十一,前导零”。然后011
将 string 转换为 integer :只是 integer ,而不是 base-10整数。当您要求解释器显示整数时,整数的内部表示形式只会转换为以10为底的整数。 (在内部,Python整数实际上使用2 ** 30为底,但是我们大多数人都不必考虑那么多,我建议您也不要这样。)
现在考虑只使用整数。如果要屏蔽的位数为int()
,则(如johnrsharpe所指出的那样),您可以使用b
获得相应的掩码:
(2**b - 1)
只需演示一下这就是您真正想要的:
>>> 2**b - 1
7
然后,您可以使用按位>>> bin(2**b - 1)
'0b111'
运算符来获取所需的数字。这与字符串方法有点相反:不是切掉想要的3位数字,而是使用&
设置不想为零的数字:
&
然后您可以直接获得结果,而无需进行字符串转换,分割并转换回整数:
a = 100011
b = 000111 &
------
000011
如您所见,一步就能得到相同的结果。在您的问题中,我还看到一个右移运算符>>> a & 2**b - 1
3
,但由于您将零位移位,所以它什么也不做。如果您还想接受平移量,例如说>>
,则在上面的示例中,使用s
而不是(a >> s)
。
答案 2 :(得分:0)
如果您实际上想要整数值的(较低)位:可以执行以下操作:
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