将位位置转换为掩码值

Converting bit position to mask value

我想根据位的位置动态计算mask的值

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

基本上不会消耗太多的指令。您正在做的事情在一次操作中可能没问题。这是一个在 SO 上解释这个问题的答案:Which is faster: x<<1 or x<<10? 基本上速度没有差异。

请在 SO 上查看此答案以了解实现:How do you set, clear, and toggle a single bit?

在大多数体系结构中,逻辑左移都支持单个原子指令。例如:

  • MIPS:SSL
  • 手臂:LSL
  • x86: SHL
  • AVR:LSL

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

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

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