首页 > 解决方案 > 当数字的任何位等于0时如何打印1?

问题描述

当数字的任何位等于 0 时,我需要打印出值 1,并且目前我正在努力解决如何执行此操作。我不应该使用任何相等或不等式测试,并且基本上仅限于位级和逻辑运算。有任何想法吗?

int b = 15;
printf("prints 1 when any bit of a number equals 0: %d\n", //PRINT GOES HERE);

b = 10;
printf("prints 1 when any bit of a number equals 0: %d\n", //PRINT GOES HERE);

标签: cbinarybitwise-operators

解决方案


我不明白你的问题,但对于两个补码有符号整数,所有位都设置为数字-1

所以你需要检查数字是否不相等-1

void foo(int a)
{
       printf("prints 1 when any bit of a number equals 0: %d\n", !((unsigned)a ^ (unsigned)-1));
}

int  main(void)
{
    foo(15);
}

但是IMO太琐碎了。您可能希望从第一个(最重要的)设置位开始检查(所以15打印014打印1):

unsigned mask(int a)
{
    int bit;
    if(!((unsigned)a ^ (unsigned)-1)) return -1;
    for(bit = sizeof(a)*CHAR_BIT - 1; bit; bit--)
    {
        if(((unsigned)a & (1U << bit))) break;
    }
    return (1U << (bit + 1)) - 1;
}

void foo(int a)
{
       printf("prints 1 when any bit of a number equals 0: %d\n", !!((a & mask(a)) ^ mask(a)));
}


int  main(void)
{
    foo(15);
}

推荐阅读