C 位掩码左移

C 位掩码左移,c,bit-shift,C,Bit Shift,我试图解决一个问题,但我不知道这是否是一个好的解决方案 构建一个类型为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); ret

我试图解决一个问题,但我不知道这是否是一个好的解决方案

构建一个类型为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;
}
#包括
#包括
无符号长掩码;
int main()
{
int i;
对于(i=0;i而言,效果更好

#include <stdio.h>
#include <stdlib.h>
unsigned long mask;
int main()
{
    int num = 14;
    mask = (1 << num) - 1;
    printf("%lu", mask);
    return 0;
}
#包括
#包括
无符号长掩码;
int main()
{
int num=14;

掩码=(1)您不简单编写
0x3fff
0b0011'1111'1111'1111
的任何原因?避免循环的线索-如果您从一个正好有1位设置为1的数字中减去1,所有其他位都为零,会发生什么情况。这可能会更好(对于站点)编辑@5gon12eder:不使用
0b0011'1111'1111'1111
的一个很好的理由是,这是C语言中的一个语法错误(我认为,除了最新版本的C++之外,其他所有版本都存在语法错误)@5gon12eder:我并没有说它更可读。为什么这样会更好呢?因为掩码是
无符号长的
,所以它应该用
%lu
打印。既然OP是问构造位掩码,而不是打印它,那么作为一个注释就更好了。(如果问题不那么含糊,这甚至不是一个答案。)@DariusIonut同样的原因1000-1是999。如果你想让N 9在基数10中,你就接受(10^N)-1。如果你想让N 1在基数2中,你就接受(2^N)-1。@DariusIonut如果你需要左边的位,我会给你一个提示:
~