检查数字中的偶数或奇数“1”位

时间:2012-10-13 19:05:09

标签: c bitwise-operators bit logical-operators

我想检查数字是否将所有偶数或奇数位设置为1并且仅将它们设置为1。例如:

数字42是正确的,因为在二进制代码101010中,它具有全部且仅偶数位设置为1。 数字21也是正确的,10101

例如691000101不正确,因为1只有三个奇数位集。

我尝试使用^, &, >>, <<进行不同的操作,但我仍然不知道如何使用这些运算符执行此操作。是的,我需要使用C中的逻辑运算符来执行此操作。

3 个答案:

答案 0 :(得分:5)

这些数字具有(x ^ (x >> 1)) + 1是2的幂的属性。如果y

,则y & (y - 1) == 0是2的幂

因此,一个测试可能是((x ^ (x >> 1)) + 1) & (x ^ (x >> 1)) == 0,适用于任何大小的数字。

答案 1 :(得分:3)

#include <stdio.h>

int main(void)
{
    unsigned uu;

    for (uu=0; uu < 43; uu++ ) {
        int res;
        res = (((uu & 0xAAAAAAAA) == uu) || ((uu & 0x55555555) == uu) );
        printf("%u: %d\n", uu, res);
    }
    return 0;
}

答案 2 :(得分:1)

bool isEven(int n){
   bool isEven = true;
   while(n){
      if( n & 1 ){
          isEven = !isEven;
      }
      n = n >> 1;
   }

   return isEven;
}

while(n)将继续,只要n是!= 0,它仍然有一个。 如果第一位是1,那么我们将even参数更改为相反(甚至变为奇数,反之亦然),在每次迭代时我们将数字向右移一位。