c - 在缓冲区中找到第一个未设置的位(优化)

标签 c performance algorithm optimization bit-manipulation

在任意长度的数组中找到第一个未设置位的位偏移的最快/最干净的方法是什么?

假设你的函数的原型(prototype)是这样的 size_t first_unset_bit(char unsigned const *buf, size_t bit_count, size_t start_bit); 并且它可以在同一个上快速连续调用多次缓冲。如果能给出更好的原型(prototype),请论证。

如果您使用任何程序集,请提供将在 core2 或更高版本上运行的 x86 示例。我会将答案授予提供速度与美观最佳结合的解决方案。

更新0

这是我天真的实现。我不知道它是否真的正确,它还没有在实时系统中使用。

static size_t first_unset_bit(char unsigned const *buf, size_t bit_count, size_t start_bit)
{
    for (; start_bit < bit_count; ++start_bit)
    {
        size_t buf_index = start_bit / CHAR_BIT;
        int bit_index = start_bit % CHAR_BIT;
        if (!((buf[buf_index] >> bit_index) & 1))
            return start_bit;
    }
    return -1;
}

最佳答案

Linux 有一个我认为是名为“find_first_zero_bit”的高度调整的实现。

关于c - 在缓冲区中找到第一个未设置的位(优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373418/

相关文章:

Python+C 比纯 C 快(稍微)快

java - 在 C、C++ 和 Java 中提升/重新排序 : Must variable declarations always be on top in a context?

C: fgetc 给出段错误

c++ - 这是多重继承的好用法吗?

r - for 循环和 apply 函数系列之间的性能差异是什么?

java - Z 缓冲算法未 100% 正确绘制

algorithm - Deutsch-Jozsa 算法

c++ - 创建 Win32 工具栏的好教程吗?

performance - ADD 1 真的比 INC 快吗? x86

algorithm - 三列新闻提要的最小长度(如 google+)?