c - 按位循环遍历大数据 block 的最快方法是什么

标签 c performance optimization bitmask

我正在按字节运行二进制数据的内存块。

目前我正在做这样的事情:

for (i = 0; i < data->Count; i++)
{   
    byte = &data->Data[i];
    ((*byte & Masks[0]) == Masks[0]) ? Stats.FreqOf1++; // syntax incorrect but you get the point.
    ((*byte & Masks[1]) == Masks[1]) ? Stats.FreqOf1++;
    ((*byte & Masks[2]) == Masks[2]) ? Stats.FreqOf1++;
    ((*byte & Masks[3]) == Masks[3]) ? Stats.FreqOf1++;
    ((*byte & Masks[4]) == Masks[4]) ? Stats.FreqOf1++;
    ((*byte & Masks[5]) == Masks[5]) ? Stats.FreqOf1++;
    ((*byte & Masks[6]) == Masks[6]) ? Stats.FreqOf1++;
    ((*byte & Masks[7]) == Masks[7]) ? Stats.FreqOf1++;
}

面具在哪里:

for (i = 0; i < 8; i++)
{
    Masks[i] = 1 << i;
}

(不知怎的,我没能在循环或内联函数中快速完成它,所以我把它写出来了。)

有人对如何改进第一个循环有任何建议吗?我对细节处理缺乏经验。

这似乎是一件愚蠢的事情。但我正在实现压缩算法。我只想将位访问部分放在右边。

谢谢!

PS:这是在 Visual Studio 2008 编译器上的。因此,如果这些建议适用于该编译器,那就太好了。

PPS:我刚刚意识到,我不需要增加两个计数。一个就足够了。然后计算最后总位数的差值。 但这仅适用于计数。我真正想要快速完成的是位提取。

编辑: 提出的查找表想法很好。 我意识到我在标题中提出了错误的问题。 因为最终我想做的不是计算位数,而是尽可能快地访问每一位。

另一个编辑: 是否可以将数据中的指针前进一位?

另一个编辑: 感谢您迄今为止的所有回答。

我想在接下来的步骤中实现的是一个不复杂的二进制算术编码器,它不分析上下文。所以我现在只对单个位感兴趣。最终它将成为上下文自适应 BAC,但我会稍后再讨论。

可以选择处理 4 个字节而不是 1 个字节。但超过 32 位的循环成本也很高,不是吗?

最佳答案

最快的方法可能是构建一个字节值与该字节中设置的位数的查找表。至少这是我在 Google 面试时的答案。

关于c - 按位循环遍历大数据 block 的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/418266/

相关文章:

java - Java 中的低音增强

c - C中参数数量可变的函数的奇怪行为

c - ffmpeg avio_open2() 无法打开输出 rtsp 流

c - 通过 C 中的循环阻塞进行优化

c++ - 动态分配的数组或 std::vector

php - PHP 的单个大文件还是许多小文件?

mysql - 了解 mysql 元组搜索的性能影响

CRC8算法说明

c++ - 如何在 Linux 上强制关闭套接字?

c# - 在 WP8 上更改按钮边框颜色时滞后