如何使用C程序根据不同的长度值设置掩码

How to set the mask based on the different values of lengths using C program

在一个函数中,我必须传递位长,并根据位长设置掩码。例如,这是我的程序部分

if(length == 8)
    mask = 0xff;
if(length == 7)
    mask = 0x7f;
if(length == 12)
    mask = 0x3ff;
if(length == 16)
    mask = 0xffff;

当长度从 1 到 16 不等时,如何使用一些循环语句来设置掩码? 如果有人帮忙就太好了,在此先感谢。

从零开始。然后对于掩码中的每一位,左移 1,然后在末尾 OR 1 位。

uint16_t mask = 0;
for (int i = 0; i < length; i++) {
    mask <<= 1;
    mask |= 1;
}

您可以按照以下方式进行操作:

uint16_t mask = 0;
for (size_t i = 0; i < length; i++)
    mask |= (1 << i);

对于循环的每次迭代,您或 | 您的 mask 向左移动 i 个位置。

How to set the mask based on the different values of lengths using C program?

将 1u 移动 n,然后减去 1。不需要循环。最好使用 unsigned 类型并防止带有掩码的大型 length 以确保没有 undefined behavior (UB).

#define UINT_WIDTH 32
unsigned length = foo();
unsigned mask = (1u << (length & (UINT_WIDTH - 1)) - 1u;

How can I use some loop statements to set the mask as the length varies from 1 to 16?

这适用于 [1 ... UINT_WIDTH]


如果使用像 uint16_t 这样的固定宽度类型,则将 ..._WIDTH 掩码设置为 16。

对于可移植代码,UINT_WIDTH需要与unsigned保持一致。

#include <limits.h>
#if UINT_MAX == 0xFFFF
  #define UINT_WIDTH 16
#elif UINT_MAX == 0xFFFFFFFF
  #define UINT_WIDTH 32
#elif UINT_MAX == 0xFFFFFFFFFFFFFFFF 
  #define UINT_WIDTH 64
#else
  // Very rare
  #error TBD code
#endif