说我有一个内存中的数字看起来像这样(或类似的,我不知道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}}
然而,这对我来说似乎很尴尬和缓慢。如果这是实现这一目标的唯一方法,我想我可以忍受它,但如果不是这样的话我会喜欢它。
答案 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
会产生不准确的结果。