我有一个关于按位操作所需的周期数的问题,或者更准确地说,是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)可能是例外。

07-24 09:44
查看更多