由于 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/