Python 如何设置位

Python How to get set bit

假设我有一个数字,在内存中看起来像这样(或类似的,我不知道 Python 如何存储数字):

0000 0000 0000 1000

我想知道设置了什么位(感谢@muddyfish,我会澄清这些数字只会设置一位),在本例中是 3,因为 2^3 = 8。我可以只使用 log2实现这一目标,但这似乎可以通过 'bit twiddling' 技术轻松解决。我也可以像这样遍历所有位:

def getSetBit(num):
    if num == 0:
        return -1

    bit = 0
    while num != 1:
        bit += 1
        num >>= 1

    return bit

# getBitSet(0b100000) == 5
# getBitSet(1) == 0

然而,这对我来说似乎很尴尬,而且速度比应有的慢。如果这是做到这一点的唯一方法,我想我可以接受,但如果不是,我会喜欢它。

要获取最高位集的位数,您可以使用

int.bit_length()-1

这比使用 math.log() 或您发布的其他函数更有效

编辑:

根据要求,已发布 timeit 结果:

python -m timeit -s 'import math;x=100' 'int(math.log(x,2))'

1000000 loops, best of 3: 0.5 usec per loop

python -m timeit -s 'i = 100' 'i.bit_length()-1'

10000000 loops, best of 3: 0.106 usec per loop

此外,如果值高于 2**29,使用 math.log 会产生不准确的结果。