Python如何获取设置位

时间:2015-08-16 20:13:42

标签: python bit-manipulation bit

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

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

我想得到什么位设置(感谢@muddyfish,我会澄清这些数字只有一位设置),在这种情况下为3,因为2 ^ 3 = 8.我可以用log2来实现这个,但这似乎可以通过'bit twiddling'技术轻松解决。我也可以循环遍历所有这些位:

{{1}}

然而,这对我来说似乎很尴尬和缓慢。如果这是实现这一目标的唯一方法,我想我可以忍受它,但如果不是这样的话我会喜欢它。

1 个答案:

答案 0 :(得分:2)

要获取最高位设置的位数,可以使用

int.bit_length()-1

这比使用math.log()或您发布的其他功能

更有效

编辑:

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

  

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

     

1000000个循环,最好是每循环3:0.5 usec

     

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

     

10000000循环,最佳3:每循环0.106次使用

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