c - 按位运算速度比较

标签 c bit-manipulation

我对按位运算(或更准确地说,异或运算)所需的周期数有疑问。在我的程序中,我有两个 uint8_t 变量的一维数组,固定大小为 8。我想对两个数组进行异或运算,我想知道最有效的方法是什么。这是总结我发现的选项的代码:

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;
}

从周期/字节的角度来看,最佳选择是什么?

最佳答案

所有基本的二元运算——andorxornot——在一个时钟周期内执行(或更少)自 1960 年代以来的几乎所有处理器架构。我说“或更少”是因为获取指令、跟踪就绪寄存器等的开销可能会将二进制运算时间置之度外。

为了使算法更快,有必要研究数据的缓存特性。

大多数使用二元运算的实用算法都比相关的 I/O 更快。散列算法(如 SHA family )可能是个异常(exception)。

关于c - 按位运算速度比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32892747/

相关文章:

c++ - 整数位表示的哪一部分是标准的一部分?

database - Oracle 中的按位异或

x86 - 如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数

c++ - 计算表示有符号整数所需的最小字节数

c++ - C2059 语法错误 'string' ?

c - 由于内置函数的类型冲突而无法执行程序

无法使用c中的循环链表中的条件删除节点

c - 在 C 中声明常量字符串的最佳方法

使用 free() 时 C 堆缓冲区损坏

python - 使用python将bytearray转换为float