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

时间:2018-05-07 13:05:43

标签: c bitmask

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

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

如何使用一些循环语句设置掩码,长度从1到16不等? 如果有人帮忙,那将是很好的,谢谢你。

3 个答案:

答案 0 :(得分:2)

  

如何使用C程序根据长度的不同值设置遮罩?

n移1u,然后减去1.不需要循环。最好使用 unsigned 类型,并使用掩码防范大length以确保没有未定义的行为(UB)。

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

如何使用一些循环语句设置掩码,长度从1到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

答案 1 :(得分:1)

以零值开头。然后,对于掩码中的每个位,向左移1,然后向右移1位。

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

答案 2 :(得分:0)

您可以执行以下操作:

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

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