将位位置转换为掩码值

时间:2015-03-29 06:16:59

标签: c embedded

我想根据位位置动态计算掩码的值。

例如:32位值中第17位的掩码值为0x00020000,第18位的掩码值为0x00040000。因此,如果我知道像17,18等位位置,如何动态转换为掩盖C中的值?当然左移是一种方法(1<<171<<18)。但我认为左移可能会消耗太多指令!或者左移是最好和最有效的方法?

2 个答案:

答案 0 :(得分:6)

基本上,它不会消耗太多指令。你在做什么可能在一次手术中没问题。这是一个在SO上解释这个问题的答案:Which is faster: x<<1 or x<<10?基本上速度没有区别。

请参阅以下有关实施的答案:How do you set, clear, and toggle a single bit?

答案 1 :(得分:2)

在大多数架构中,支持逻辑左移的单个原子指令。例如:

  • MIPS:SSL
  • ARM:LSL
  • x86:SHL
  • AVR:LSL
然而,PIC微控制器是一个更复杂的故事。不同版本的PIC具有不同的指令集,并且并非所有版本都包括逻辑左移。低端(PIC24 / sdPIC之前)PIC指令集在任何情况下都不是特别适合于C代码生成,因为它们缺乏对许多明显无关紧要的C操作的直接支持。

您应该检查目标的指令集和编译器生成的实际汇编程序/机器代码 - 大多数编译器都支持输出汇编程序列表,或者您可以在调试器或模拟器或独立的反汇编程序中反汇编输出。

在不太可能缺少逻辑左移或编译器优化的情况下,可以充分利用现有指令集,您可以(在没有无意义的内存成本的情况下)使用查找表来至少优化时间,但在大多数情况下,没有逻辑左移的部分可能也会有非常小的内存资源,所以这可能是一个不切实际的解决方案。