首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置和获取的最快方法

设置和获取的最快方法
EN

Stack Overflow用户
提问于 2010-12-08 03:39:30
回答 1查看 333关注 0票数 3

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

以下是我的方法:

代码语言:javascript
复制
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;
   }
}

代码语言:javascript
复制
bool GetBit(const uint32* data, const uint32 bitpos)
{
   return (data[bitpos >> 5u] >> (31u - (bitpos & 31u))) & 1u;
}

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-02-08 05:45:50

首先,我将从所有表达式中删除31u - ...:它所做的就是重新排序您私有的位集表示中的位,这样您就可以颠倒这个顺序,而不会有人注意到它。

其次,您可以通过使用clever bit hack来删除分支

代码语言:javascript
复制
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:

代码语言:javascript
复制
bool GetBit(const uint32* data, const uint32 bitpos)
{
    return data[bitpos >> 5u] & (1u << (bitpos & 31u));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4380838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档