位掩码转数组索引

4
有没有一种简单的方法将位掩码转换为数组索引?
例如,如果我有一个枚举值:
a = 0x01,
b = 0x02,
c = 0x04,
d = 0x08,
e = 0x10, 
etc

我希望能够将相关数据存储在数组中,是否有一种简单的方法可以将a转换为0,b转换为1,c转换为2等等?

非常感谢。


你可能想要查看这个链接:http://referencesource.microsoft.com/#PresentationFramework/Framework/MS/Internal/UncommonValueTable.cs,93b81e5e13cb3600 (维护不同数组大小的位掩码) - zahir
5个回答

6
r =   ln base 2 
and programmatically,

unsigned int v=yourEnumValue;
unsigned r = 0; 
while (v >>= 1) 
{
   r++;
}

r is your answer

有人知道更快、更底层的解决方案吗? - clankill3r

4

我不确定这是否是您要问的,但为什么不直接取2为底的对数呢?


啊,是的,自然对数。这就是我要找的东西。我想肯定有什么,只是想不起来是什么了。干杯。 - Dynite
那不是自然对数。自然对数是以 e 为底的对数。 - Can Berk Güder

3

Log2 n?


2
我不知道像你所要求的那样有一个简单的解决方案,但是为什么不使用地图而不是数组呢?这样应该可以在不进行任何神奇转换的情况下工作。

2

使用std::map:

#include <map>

std::map <my_enum, my_datatype> m;
m[ a ] = whatever;

1
我不想使用映射表,因为我不想存储键所带来的开销。 - Dynite
枚举的开销非常小 - 您必须将其与计算索引的开销进行比较。 - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接