我有一个16位值的流,我需要调整每个样本的4个最低有效位。每个短片的新值都不同,但重复每个X短片 - 基本上用ID标记每个短片。
除了for-loop之外,还有什么比这更快的技巧吗?
更多详情 我正在将文件从一种格式转换为另一种格式。目前使用FILE *实现,但如果有用,我可以使用Windows特定的API。
[while data remaining]
{
read X shorts from input
tag 4 LSB's
write modified data to output
}
除了批量操作之外,我想我一直在寻找关于最后4位的最佳方法的意见。
我们现在只支持win7(32或64),所以硬件就是人们为此选择的。
答案 0 :(得分:3)
如果你正在努力,例如一个32位平台,你可以一次做2个。或者在现代x86等效产品上,您可以使用SIMD指令一次操作128位。
除此之外,没有比特错误的方法可以避免在整个数据集中循环,因为听起来你必须修改每个元素!
答案 1 :(得分:0)
最后4位的最佳方法是你的选择2:
int i;
i &= 0xFFF0;
i |= tag;
如果您事先知道标记值,那么长时间执行此操作会更快。 你可以在一个长度内记忆4条短裤,然后在4条短裤上进行与上述相同的操作:
long l;
l &= 0xFFF0FFF0FFF0FFF0;
l |= tags;
其中tags = (long) tag1 << 48 + (long) tag2 << 32 + (long) tag3 << 16 + (long) tag4;
如果你经常重复使用这个值标签,这是有道理的,而不是你必须为每组4个短裤不同地构建它。