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
会产生不准确的结果。
假设我有一个数字,在内存中看起来像这样(或类似的,我不知道 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
会产生不准确的结果。