当前位置:  开发笔记 > 编程语言 > 正文

以每比特为基础循环遍历大数据块的最快方法是什么

如何解决《以每比特为基础循环遍历大数据块的最快方法是什么》经验,为你挑选了2个好方法。

我按字节顺序运行二进制数据的内存块.

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

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位的循环也是昂贵的,不是吗?



1> Paul Tomblin..:

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



2> Dave L...:

使用将每个字节值(256)映射到其中1的数字的表.(0的#只是(8 - 1的1)).然后迭代字节并对每个字节执行单个查找,而不是多次查找和比较.例如:

int onesCount = 0;
for (i = 0; i < data->Count; i++)
{   
    byte = &data->Data[i];
    onesCount += NumOnes[byte];
}
Stats.FreqOf1 += onesCount;
Stats.FreqOf0 += (data->Count * 8) - onesCount;

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有