繁体   English   中英

从整数中提取运行时位数

[英]Extracting runtime number of bits from integer

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

例如,某个代码正在生成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]

但这甚至行不通。

从这个问题出发,目前尚不清楚您实际上想做什么,但据我了解,您想从“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM