我有一个关于按位操作所需的周期数的问题,或者更准确地说,是XOR操作。在我的程序中,我有两个固定大小为8的uint8_t变量的一维数组。我想把两个数组都异或,我想知道什么是最有效的方法。这是一个代码,总结了我找到的选项:
int main() {
uint8_t tab[4] = {1,0,0,2};
uint8_t tab2[4] = {2,3,4,1};
/* First option */
uint8_t tab3[4] = {tab[0]^tab2[0], tab[1]^tab2[1], tab[2]^tab2[2], tab[3]^tab2[3]};
/* Second option */
uint32_t* t = tab;
uint32_t* t2 = tab2;
uint32_t t3 = *t ^ *t2;
uint8_t* tab4 = &t3;
/* Comparison */
printf("%d & %d\n", tab3[0], tab4[0]);
printf("%d & %d\n", tab3[1], tab4[1]);
printf("%d & %d\n", tab3[2], tab4[2]);
printf("%d & %d\n", tab3[3], tab4[3]);
return 0;
}
从循环/字节的角度来看,什么是最佳选择?
最佳答案
自20世纪60年代以来,几乎每种处理器结构上的所有基本二进制操作和(或)或(或)异或(或)不在一个时钟周期(或更少)内执行。我说“或更少”,因为获取指令、跟踪就绪寄存器等的开销可能会使二进制操作时间陷入噪声。
为了使算法更快,有必要研究数据的缓存特性。
大多数使用二进制操作的实用算法都比相关的I/O快。哈希算法(如SHA family)可能是例外。