我只是想开发用于在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;
}
谢谢!
答案 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));
}