设置和获得一点点的最快方法

时间:2010-12-07 19:39:30

标签: bit operations bitset

我只是想开发用于在uint32数组中设置和获取位的超快速函数。例如,您可以说“将位1035设置为1”。然后,使用1035/32索引的uint32与位置1035%32一起使用。我特别不喜欢setbit函数中的分支。

这是我的方法:

void SetBit(uint32* data, const uint32 bitpos, const bool newval)
{
   if (newval)
   {
      //Set On
      data[bitpos >> 5u] |= (1u << (31u - (bitpos & 31u)));
      return;
   }
   else
   {
      //Set Off
      data[bitpos >> 5u] &= ~(1u << (31u - (bitpos & 31u)));
      return;
   }
}

bool GetBit(const uint32* data, const uint32 bitpos)
{
   return (data[bitpos >> 5u] >> (31u - (bitpos & 31u))) & 1u;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

首先,我会从所有表达式中删除31u - ...:它只是重新排序位集的私有表示中的位,因此您可以在没有人注意的情况下翻转此顺序。

其次,您可以使用clever bit hack

删除分支
void SetBit(uint32* data, const uint32 bitpos, const bool f)
{
    uint32 &w = data[bitpos >> 5u];
    uint32 m = 1u << (bitpos & 31u);
    w = (w & ~m) | (-f & m);
}

第三,您可以通过让编译器进行转换来简化您的getter:

bool GetBit(const uint32* data, const uint32 bitpos)
{
    return data[bitpos >> 5u] & (1u << (bitpos & 31u));
}