一尘不染

生成位掩码的算法

algorithm

我面临着基于输入参数生成位掩码的独特问题。例如,

如果param = 2,则掩码将为0x3(11b)如果param = 5,则掩码将为0x1F(1 1111b)

我使用C语言中的for循环实现了

int nMask = 0;
for (int i = 0; i < param; i ++) {

    nMask |= (1 << i);
}

我想知道是否有更好的算法~~~


阅读 585

收藏
2020-07-28

共1个答案

一尘不染

关于这样的位掩码,要注意的一件事是它们总是比2的幂小1。

该表达式1 << n是获得2的n次方的最简单方法。

您不希望Zero提供零的位掩码00000001,而是希望它提供零。因此,您需要减去一个。

mask = (1 << param) - 1;

编辑:

如果要为param> 32设置特殊情况:

int sizeInBits = sizeof(mask) * BITS_PER_BYTE; // BITS_PER_BYTE = 8;
mask = (param >= sizeInBits ? -1 : (1 <<  param) - 1);

此方法适用于16、32或64位整数,但是您可能必须显式键入‘1’。

2020-07-28