gpt4 book ai didi

bit - 设置和获取位的最快方法

转载 作者:行者123 更新时间:2023-12-02 07:53:38 25 4
gpt4 key购买 nike

我只是想开发超快速函数来设置和获取 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;
}

谢谢!

最佳答案

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

其次,您可以使用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));
}

关于bit - 设置和获取位的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com