我只是在尝试开发超快的函数来设置和获取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;
}谢谢!
发布于 2012-02-08 05:45:50
首先,我将从所有表达式中删除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));
}https://stackoverflow.com/questions/4380838
复制相似问题