从整数中提取运行时位数

时间:2019-01-26 08:46:15

标签: python

我需要从整数中提取一些位。但是,要提取多少位并不确定。

例如,某个代码正在生成2个数字ab。我想要的是可以执行的代码

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]

但是即使这样也不起作用。

3 个答案:

答案 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