从不移位的字节中获取位

Obtaining bits from a byte without shifts

我正在尝试从 C 中的一个字节中获取一些位。目前我是通过移位然后位屏蔽 (0xFF) 来实现的,但是移位运算符需要很长时间。还有另一种仅使用按位运算的方法吗?如果是的话怎么办?

谢谢!

恐怕不会。每个位位置都是一个独立的数据流。只要您受限于这些,再多的按位运算也不会使一位影响除其自身以外的任何位置。

即使允许基本算术运算,适当的运算(乘以和除以 2 的幂)也比移位运算更慢且不太明显。


要右移 N 位,除以 2^N。 要左移 N 位,乘以 2^N.

如果比特每次都在同一个地方,而且你可以在原地使用它们,那就移动你的掩码。例如

word & 0x3FC0

将为您获取单词的第 2-9 位(或第 13-6 位,具体取决于您的索引)。

不过,和以前一样,我会惊讶地发现算术运算比移位更快。您使用的是什么平台,其中 shift 很慢?大多数处理器将此作为机器指令。


由于您不共享机器或应用程序的详细信息,我所能建议的就是转移到最近的字节边界——相距不超过 4 位——并通过访问字节提取所需的值.如果这对您来说仍然不是一个合理的解决方案,那么我将等待正确的问题描述。

如果您想将特定(单个)位移动到最低位,您可以使用这样的 hack:

(x & mask) != 0

其中 mask 选择单个位。