我尝试解决一个问题,但不确定这是否是正确的解决方案。
构建一个类型为unsigned long的掩码,其中最低有效位(从右边开始)的14位设置为1;
#include <stdio.h>
#include <stdlib.h>
unsigned long mask;
int main()
{
int i;
for(i=0;i<14;i++)
mask|=(1<<i);
printf("%li",mask);
return 0;
}
更好的做法是
#include <stdio.h>
#include <stdlib.h>
unsigned long mask;
int main()
{
int num = 14;
mask = (1 << num) - 1;
printf("%lu", mask);
return 0;
}
num
表示最低有效位的总数。
工作原理
2^14 = 16348 的二进制表示为 0000000000000000 0100000000000000
(在32位中)
而且0000000000000000 0011111111111111
因此有14个最低有效位设置为1。~
- Mark Ransom~(-1<<n)
,但这可能只适用于二进制补码....等等他说从左边开始...即使如此,只需从位数中减去n而不要取反。 - technosaurus
0x3fff
或者0b0011'1111'1111'1111
呢? - 5gon12eder0b0011'1111'1111'1111
的一个很好的理由是它在C中是语法错误(我认为,在除最新版本的C++之外的所有版本中也是如此)。 - Keith Thompson