【问题标题】:How to print 1 when any bit of a number equals 0?当数字的任何位等于0时如何打印1?
【发布时间】:2021-01-23 23:01:06
【问题描述】:

当数字的任何位等于 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);

【问题讨论】:

  • @ScottHunter 我目前已经尝试过诸如“!b”,“!!(b ^ 0xF)”,“!(!b)”之类的东西,不幸的是没有成功获得结果我需要
  • 你的任务有没有明确告诉你输出的一定是1?或者它必须是非零的?
  • 您的任务是否明确告诉您输入的类型是int 而不是unsigned int
  • @AndreasWenzel 输入是 int 类型,它说必须输出 1
  • 请注意,!!! 是(不)等式测试。我怀疑你被要求通过移位和按位运算符算术合并位并显示结果。

标签: c binary bitwise-operators


【解决方案1】:

我不明白你的问题,但是对于两个补码有符号整数,所有位都设置为数字 -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);
}

【讨论】:

    【解决方案2】:

    您可能希望创建一个全为 1 (~0x0) 的掩码,然后将其与数字进行异或。如果有任何 1 的后缀,则至少有一个原始位是 0,因此如果至少有一个 1,则可以使用 &&1 返回 1,如果没有,则返回 0。

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多