我面临着一个独特的问题:根据输入参数生成位掩码.例如

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

这是我使用C语言中的for循环实现的,类似于

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

    nMask |= (1 << i);
}

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

推荐答案

这样的位掩码需要注意的一点是,它们总是比2的幂小1.

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

您不希望Zero提供位掩码00000001,您希望它提供零.所以你需要减go 一.

mask = (1 << param) - 1;

Edit:

If you want a special case for param > 32:

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

此方法应适用于16、32或64位整数,但可能必须显式键入"1".

C++相关问答推荐

如何在Switch和case中发出有关enum类型不匹配的编译器警告?

命名信号量不会像进程之间同步中假设的那样工作

设计处理各种数据类型的方法和数据 struct

getchar读css + z还是返回css?

标准的C17标准是用括号将参数包装在函数声明中吗

手动矢量化性能差异较大

使用GOTO从多个嵌套循环C继续

测量ARM MCU中断延迟的问题

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

实现简单字典时C语言中的段错误

错误:包含文件时类型名称未知

C:如何将此代码转换为与数组一起使用?

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

try 查找带有指针的数组的最小值和最大值

为什么我的旧式&q;函数在传递浮点数时会打印2?

如何使用calloc和snprintf

生成的头文件不包括用户定义的文件

分支预测和UB(未定义的行为)

在链表中插入一个值

多行表达式:C 编译器如何处理换行符?