在纯python中获取标记的位索引

在纯python中获取标记的位索引,python,Python,我在这里涉及两个问题:一个是“如何”,第二个是“这个伟大的解决方案听起来好吗?” 事情是这样的:我有一个int值的对象,它存储使用该对象的所有人的ID。这是使用标记技术完成的(人员id为0-10) 我遇到了这样一种情况,如果这个值只标记了一个id,我想得到这个id 对于第一个测试,我使用了value&(value-1),这很好,但对于第二件事,我开始想知道最好的方法是什么(我想知道的原因是,这种计算在关键位置一秒钟至少发生300次) 所以我想到的第一种方法是使用math.log(x,2),但是我

我在这里涉及两个问题:一个是“如何”,第二个是“这个伟大的解决方案听起来好吗?”
事情是这样的:我有一个int值的对象,它存储使用该对象的所有人的ID。这是使用标记技术完成的(人员id为0-10)

我遇到了这样一种情况,如果这个值只标记了一个id,我想得到这个id

对于第一个测试,我使用了
value&(value-1)
,这很好,但对于第二件事,我开始想知道最好的方法是什么(我想知道的原因是,这种计算在关键位置一秒钟至少发生300次)

所以我想到的第一种方法是使用
math.log(x,2)
,但是我对这个解决方案感到有点不舒服,因为它涉及对值的“硬”数学运算,而不是非常简单的位运算,而且我觉得我遗漏了一些东西


我考虑的第二种方法是计算
value如果您使用的是Python2.7或3.1及更高版本,那么您可以对整数使用该方法。它返回表示整数所需的位数,即比最高有效位的索引多1位:

>>> (1).bit_length()
1
>>> (4).bit_length()
3
>>> (32).bit_length()
6

这可能是最具python风格的解决方案,因为它是标准库的一部分。如果您发现
dict
性能更好,这是一个性能瓶颈,那么我认为没有理由不使用它。

为什么只使用一个值来存储一组数字?因为标记/标记测试操作都位于代码中最密集的区域,我发现最有效的方法是逐位运算。为什么您特别询问
dict
解决方案的合法性?这似乎是最可读的,最具python风格的,也是最快的,只要看看你在那里写的东西。你认为这不是一个“合法”的解决方案有什么原因吗?因为我不认为自己是python专家,所以基于dict的解决方案让我觉得好像做错了什么。我仍然处于需要验证“奇怪”解决方案的水平,因为现在它可能还可以,但我看到它很容易变成一个非常有趣的笑话
time using log: 0.0450000762939
time using loop: 0.156999826431
time using dict: 0.0199999809265
>>> (1).bit_length()
1
>>> (4).bit_length()
3
>>> (32).bit_length()
6