c - C 语言中的高效位屏蔽代码

标签 c assembly bit-manipulation performance

由于 C 的按位运算符 & , | ,和~通常也是汇编语言操作码,位屏蔽代码原则上应该非常快。

我可以选择如何在模拟算法的内部循环中添加位掩码。本质上,它归结为使用一系列预制蒙版或使用左移和右移动态更改蒙版之间的选择。

是否有特殊的技巧/技术可以使位屏蔽尽可能避免不必要的开销?从效率的角度来看,以下三种方法中的任何一种特别好/特别坏吗?

  • 选项 1:循环遍历预先录制的掩码数组,例如挑选出特定的位

    unsigned char mask[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
    for(i=0;i<8;i++) {
        ...
        (mask[i] & mem_data )
        ...
    

    }

  • 选项 2:在每次循环迭代中向下移动多个位置

    unsigned char mask=0x80;
    for(i=0;i<8;i++) {
         ...
         mem_data & (mask>>i)
         ...
    }
    
  • 选项 3:在每次循环迭代中精确下移一个位置

    unsigned char mask=0x80;
    while(mask) {
          ...
          mem_data & mask
          mask>>=1;
          ...
    }
    

编辑: 从示例中删除了 putchar(),这样就不会分散对问题的注意力

最佳答案

位掩码经常用于嵌入式世界。

并非所有处理器都可以使用变量参数进行按位移位。例如,在 MSP430 处理器上,一次只能位移一位。该实现将借助软件来进行可变量的移位。在这种情况下,必须避免选择 2。更广泛地查看程序的汇编输出,以比较最有效的解决方案。

关于c - C 语言中的高效位屏蔽代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904194/

相关文章:

c - 逐位串联

c++ - 可靠地确定 char 的大小

c - 自 ubuntu 升级以来对 `dlopen' 的 undefined reference

c++ - 在 Windows 中,如何拥有作为重定向管道的非阻塞标准输入?

C++ 使用裸函数

java - Java 中的按位左移产生相同的值......?

c - SQLite C API 如何将查询输出保存到字符串

c++ - 在 C++ 中调用汇编

c - 二元炸弹第二阶段算术

language-agnostic - 使用位域或按位运算符在字节内移动位