C中的高效位掩码

时间:2012-10-15 21:20:08

标签: 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(),因此不会分散注意力

1 个答案:

答案 0 :(得分:2)

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

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