我想根据位位置动态计算掩码的值。
例如:32位值中第17位的掩码值为0x00020000,第18位的掩码值为0x00040000。因此,如果我知道像17,18等位位置,如何动态转换为掩盖C中的值?当然左移是一种方法(1<<17
或1<<18
)。但我认为左移可能会消耗太多指令!或者左移是最好和最有效的方法?
答案 0 :(得分:6)
基本上,它不会消耗太多指令。你在做什么可能在一次手术中没问题。这是一个在SO上解释这个问题的答案:Which is faster: x<<1 or x<<10?基本上速度没有区别。
请参阅以下有关实施的答案:How do you set, clear, and toggle a single bit?
答案 1 :(得分:2)
在大多数架构中,支持逻辑左移的单个原子指令。例如:
您应该检查目标的指令集和编译器生成的实际汇编程序/机器代码 - 大多数编译器都支持输出汇编程序列表,或者您可以在调试器或模拟器或独立的反汇编程序中反汇编输出。
在不太可能缺少逻辑左移或编译器优化的情况下,可以充分利用现有指令集,您可以(在没有无意义的内存成本的情况下)使用查找表来至少优化时间,但在大多数情况下,没有逻辑左移的部分可能也会有非常小的内存资源,所以这可能是一个不切实际的解决方案。