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

在C数组中进行按位运算的最有效方法是什么

如何解决《在C数组中进行按位运算的最有效方法是什么》经验,为你挑选了2个好方法。

我有一个C数组,如:

char byte_array[10];

另一个充当面具:

char byte_mask[10];

我想在每个字节上获得另一个数组,该数组是第一个数据加上第二个使用按位运算的结果.

最有效的方法是什么?

谢谢你的回答.



1> Jason Cohen..:
for ( i = 10 ; i-- > 0 ; )
    result_array[i] = byte_array[i] & byte_mask[i];

向后移动预加载处理器缓存行.

包括比较中的减量可以保存一些指令.

这适用于所有阵列和处理器.但是,如果您知道阵列是字对齐的,则更快的方法是转换为更大的类型并执行相同的计算.

例如,让我们说n=16而不是n=10.然后这会快得多:

uint32_t* input32 = (uint32_t*)byte_array;
uint32_t* mask32 = (uint32_t*)byte_mask;
uint32_t* result32 = (uint32_t*)result_array;
for ( i = 4 ; i-- > 0 ; )
    result32[i] = input32[i] & mask32[i];

(当然你需要一个合适的类型uint32_t,如果n不是2的幂,你需要清理开头和/或结束,以便32位内容对齐.)

变化:这个问题特别要求将结果放在一个单独的数组中,但是在原地修改输入数组几乎肯定会更快.


@Trent - 问题的*点*是优化.向后退也不慢,所以你也可以.@Crashworks - 记住缓存行是对齐的,通常是在大量边界上,所以通常它必须在你要求的之前拉入字节.
担心预加载处理器缓存行似乎是一个严重的过早优化.

2> Antti Huima..:

如果你想让它更快,请确保byte_array的长度是4的倍数(在64位机器上为8),然后:

char byte_array[12];
char byte_mask[12];
/* Checks for proper alignment */
assert(((unsigned int)(void *)byte_array) & 3 == 0);
assert(((unsigned int)(void *)byte_mask) & 3 == 0);
for (i = 0; i < (10+3)/4; i++) {
  ((unsigned int *)(byte_array))[i] &= ((unsigned int *)(byte_mask))[i];
}

这比每字节字节快得多.

(注意,这是就地突变;如果你想保留原始的byte_array,那么你显然需要将结果存储在另一个数组中.)

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