【发布时间】:2011-05-21 19:38:02
【问题描述】:
我只是在尝试开发超快速函数来设置和获取 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;
}
谢谢!
【问题讨论】:
-
什么架构?什么语言?编译器现在输出什么?您可能会发现它已经相当快了。
-
它是 x86(32 位)。确实,它已经相当快了,但我认为——尤其是在 setbit 函数中,我仍然可以更快......
-
您的 SetBit 看起来确实是一个 FlipBit,因为您可能只使用 xor(通常是 ~= 运算符)。
-
它不是 FlipBit,因为您可以将位设置为独立于先前状态的固定定义状态。
标签: bit operations bitset