在函数中,我必须传递位长,并根据位长度设置掩码。例如,这是我的程序部分
if(length == 8)
mask = 0xff;
if(length == 7)
mask = 0x7f;
if(length == 12)
mask = 0x3ff;
if(length == 16)
mask = 0xffff;
如何使用一些循环语句设置掩码,长度从1到16不等? 如果有人帮忙,那将是很好的,谢谢你。
答案 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
位置。