如果使用C中的位操作,则整数中的任何位等于1,则返回1

jjA*_*man 7 c bit-manipulation bitwise-operators

我好几个小时都在考虑这个问题.这里是:

如果给定的整数"x"具有等于1的任何位,则写入一个返回1的表达式.否则返回0.

我明白我实际上只是想弄清楚x == 0,因为那是唯一没有1位的int,但我无法找到解决方案.您可能不会使用传统的控制结构.您可以使用按位运算符,加法,减法和位移.建议?

Pau*_*l R 5

这是我能想到的最好的:

y = (((-x) | x) >> (BITS - 1)) & 1;
Run Code Online (Sandbox Code Playgroud)

其中 BITS = 32 对于 32 位整数,即BITS = sizeof(int) * CHAR_BIT;

这是一个测试程序:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    const int BITS = sizeof(int) * CHAR_BIT;

    if (argc == 2)
    {
        int x = atoi(argv[1]);
        int y = (((-x) | x) >> (BITS - 1)) & 1;

        printf("%d -> %d\n", x, y);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • -x 不适用于负数。-x | x 设置 1 MSB 位,因为两个值之一都是负数。 (2认同)

小智 5

使用 !!x 会给你正确的答案。因为 !0 = 1 且 !(任何非零数)= 0。

  • 从C的角度来看,这是最好的解决方案,但它不尊重任务的约束。 (2认同)

Oli*_*rth 0

单独屏蔽每个位,将它们全部下移到 lsb 位置,或者将它们一起移动。