给定一个整数I
和一个位掩码M
,从M
获取相应的I
值。例如,如果I
是0x11111
而M
是0xff0
,则对应的值是0x11
我可以通过:
&
和I
之间执行M
操作但是这种方式有点慢,尤其是步骤2。我想要一种更有效的方法来解决此问题。
最佳答案
我不知道是否有更有效的方法。我一直都像你一样但是,请考虑通常可以通过一条CPU指令来计算要右移多少位(第二步)。必须根据本能的指令完成此操作,具体取决于您的系统。
在Windows上,此操作由_BitScanForward()提供,而在GCC上,此操作由__builtin_ctz()提供。
有关更多详细信息,请参见this answer。
例如,您的问题的可能的Windows实现可能是:
#include <Windows.h>
unsigned int maskandshift(unsigned int m, unsigned int i) {
unsigned int shift;
// _BitScanForward returns 0 if the mask is zero.
// You may prefer the actual number of 0, here:
if (m == 0)
shift = sizeof(i) * CHAR_BIT;
else {
DWORD trailing_zero;
_BitScanForward(&trailing_zero, (DWORD)m);
shift = (unsigned int)trailing_zero;
}
return (m & i) >> shift;
}
在Release配置中,此功能被编译为检查是否为零,然后在x64机器中仅检查3条汇编指令(
BSF
,AND
和SHR
)。关于c - 如何有效地将位掩码的对应值转换为整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52440886/