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

使用C中的位运算,如果整数中的任何位等于1,则返回1,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,我已经考虑这个问题好几个小时了。这是: 如果给定整数“x”的任何位等于1,则编写一个返回1的表达式。否则返回0 我知道我基本上只是想知道x==0,因为这是唯一一个没有1位的int,但我无法找到解决方案。您不能使用传统的控制结构。您可以使用位运算符、加法、减法和位移位。建议?分别屏蔽每个位,将它们全部下移到lsb位置,或将它们一起移动。以下是我能想到的最好方法: y = (((-x) | x) >> (BITS - 1)) & 1; 其中32位整数的位=32,即BITS=si

我已经考虑这个问题好几个小时了。这是:

如果给定整数“x”的任何位等于1,则编写一个返回1的表达式。否则返回0


我知道我基本上只是想知道x==0,因为这是唯一一个没有1位的int,但我无法找到解决方案。您不能使用传统的控制结构。您可以使用位运算符、加法、减法和位移位。建议?

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

以下是我能想到的最好方法:

y = (((-x) | x) >> (BITS - 1)) & 1;
其中32位整数的位=32,即
BITS=sizeof(int)*CHAR\u位

下面是一个测试程序:

#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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
常量整数位=大小(整数)*字符位;
如果(argc==2)
{
intx=atoi(argv[1]);
int y=((-x)|x)>>(位-1))&1;
printf(“%d->%d\n”,x,y);
}
返回0;
}

您可以将
int
转换为
bool
。但我怀疑这就是你做作业的目的;-)

未经测试,这是我想到的第一件事:

 while(n & pow(2, e) == 0 && e++ <= 16) ;  // 16 or 32
while(n&pow(2,e)=0&&e++
int任意位到1(无符号int n){
int结果=0,i;
对于(i=0;!result&&i
int return_not_zero(int v)
{
  r=v;
  r=(r&0xFFFF) | (r>>16); 
  r=(r&0xFF) | (r>>8);
  r=(r&0x0F) | (r>>4);
  r=(r&0x03) | (r>>2); 
  r=(r&0x01) | (r>>1); 
  return r;
}

按位AND和0以及任何数字必须等于零,但唯一简单的测试是使用0xFFFF,或设置每个位。要设置所有位,您应该有一个带符号的int,并将其赋值为-1。然后,您将有一个int,所有位都设置为1,而不管大小如何


因此,我的答案是按位计算,对于32位的值,使用-1,以下将适用于所有位模式

return (a | -a) >> 31;
怎么样!(x&&~x)&&x

#包括
void main(){
int x;
scanf(“%d”和&x);
printf(“%d\n”,(!(x&&&x)&&x));
}

它似乎有效,但我不确定溢出何时发生。

0 | | number-只有当数字为0时,它才会返回0;如果数字不是0,它就会返回1。由于没有任何位1的数字将等于0,我们需要用0进行检查。

使用!!x将给出正确答案。因为!0=1和!(任何非零数)=0。我相信这是最简单的方法

return !!(0|x);

只有当所有位都为0或x==0时,x中才不会有1。因此0 | 0->0否则0 | x->非零。

在C语言中,除零以外的任何值(正或负)都被视为真。并且应该有一个条件来检查问题的解是否返回零或一(或非零)。因此,此答案完全符合您的要求。此答案仅使用位运算符

return (x & 0xFFFF);


当“x”中的任何一位都不为1时,此行返回零,当“x”中的任何一位为1时,此行返回非零(从某种意义上说是真的)。

这是任何大小的整数,还是您有已知的大小?加减不是按位运算……如果其中一个答案解决了您的问题,您应该将其检查为“已接受”.就像16位的16个不同表达式一样?我认为有一个更优雅的解决方案。
bool
在标准C中不存在(仅C99)。是的,它可能在内部使用分支逻辑,这违反了家庭作业的规则。但在一般情况下(如果语言支持)这是一种完成任务的简洁方法。@Sven Marnach:我想我会把C99称为“标准C”,而把其他的都称为“过时的旧C”。等等,(-x)| x并不总是1??因为0是0,否则MSB位等于1
-x>>(位-1)
我认为效果很好。
|x
是不必要的,因为你无论如何都要移位这些位-x对负数不起作用。-x | x设置1个MSB位,因为两个值中有一个都是负数。@Marlon:正如@ralu所说,你需要确保如果x是负数,你仍然得到MSB集,因此需要
-x
确保shift是逻辑的,当然不是算术的-在C中使用无符号类型。还要注意,上面的解决方案“return~(x^x-1)>>31;”对于值0x8000000不起作用。对于算术移位,它可以修改为
-((a |-a)>>31)
您似乎在这里使用的不仅仅是位运算?
pow(2,e)
应该更改为
1如果允许
&&
那么
x&&1
从C的角度来看有点简单,这是最好的解决方案,但是它不尊重任务的约束。不幸的是
是一个不允许的逻辑运算符
|
是不允许的,因为它是一个逻辑运算符
return !!(0|x);
return (x & 0xFFFF);