【问题标题】:Bitmask to Array Index位掩码到数组索引
【发布时间】:2009-03-30 12:15:19
【问题描述】:

有没有一种简单的方法可以将位掩码转换为数组索引?

即。如果我有一个枚举

a = 0x01,
b = 0x02,
c = 0x04,
d = 0x08,
e = 0x10, 
etc

我想将相关数据存储在一个数组中,有没有一种简单的方法可以将 a 转换为 0、b 转换为 1、c 转换为 2 等等?

非常感谢

【问题讨论】:

标签: c++ indexing bitmask


【解决方案1】:
r =   ln base 2 
and programmatically,

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

r is your answer

【讨论】:

  • 有人知道更快更底层的解决方案吗?
【解决方案2】:

我不确定这是否是你要问的,但你为什么不只取一个 2-base log 呢?

【讨论】:

  • 啊,是的,自然对数。这就是我一直在寻找的。我以为会有什么,只是想不起来是什么。干杯。
  • 这不是自然日志。自然对数是对数基 e。
【解决方案3】:

日志2 n?

【讨论】:

    【解决方案4】:

    我不知道像您要求的那样简单的解决方案,但为什么不直接使用地图而不是数组呢?

    应该在没有任何魔法转换的情况下工作。

    【讨论】:

      【解决方案5】:

      使用 std::map:

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

      【讨论】:

      • 我不想使用地图,因为我不想要存储密钥的开销。
      • 枚举的开销很小 - 你必须将它与计算索引的开销进行比较。
      猜你喜欢
      • 2022-07-27
      • 2022-10-18
      • 2020-01-14
      • 2020-02-14
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 2022-01-02
      相关资源
      最近更新 更多