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

时间:2011-02-08 17:31:41

标签: c bit-manipulation bitwise-operators

我几个小时以来一直在考虑这个问题。这是:

  

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

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

13 个答案:

答案 0 :(得分:3)

这是我能想到的最好的:

y = (((-x) | x) >> (BITS - 1)) & 1;

其中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;
}

答案 1 :(得分:2)

使用!! x会给你正确的答案。由于!0 = 1和!(任何非零数字)= 0。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

对于32位值,以下内容适用于所有位模式。

return (a | -a) >> 31;

答案 4 :(得分:0)

您可以将int投放到bool。但我怀疑这是你作业的目的; - )

答案 5 :(得分:0)

int any_bits_to_one(unsigned int n) {
  int result = 0, i;

  for (i=0; !result && i < sizeof(unsigned int) * 8; i++)
    result |= (n & (1<<i)) ? 1 : 0;

  return result;
}

答案 6 :(得分:0)

对于32位整数

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;
}

答案 7 :(得分:0)

怎么样!(x&amp;&amp; ~x)&amp;&amp; x?

#include <stdio.h>
void main(){
  int x;
  scanf("%d",&x);
  printf("%d\n",(!(x&&~x)&&x));
}

这似乎有用,但我不确定何时会发生溢出。

答案 8 :(得分:0)

0 || number - 仅当数字为0时返回0,如果数字是0以外的任何数字,则返回1.因为没有任何位的数字将等于0,我们需要用0检查。

答案 9 :(得分:-1)

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

 while(n & pow(2, e) == 0 && e++ <= 16) ;  // 16 or 32

如果循环n后的e == 16为0。

答案 10 :(得分:-1)

按位与0和任何数字必须等于零,但唯一的万无一失的测试将是0xFFFF,或每个位被设置。要设置所有位,您应该有一个signed int,并将其指定为-1。然后,无论大小如何,您都将拥有一个将所有位设置为1的int。

所以我的答案是按位AND它与-1

答案 11 :(得分:-2)

我相信这是最简单的方法。

return !!(0|x);

x中唯一没有1的时间是所有位都为0或x == 0.所以0 | 0 - &gt; 0其他0 | x - &gt;非零。

答案 12 :(得分:-2)

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

return (x & 0xFFFF);

当“x”中的任何位都不是1时,该行返回ZERO,并且当“x”中的任何位为1时,返回非零(在某种意义上为TRUE)。