4

我想检查 number 是否将所有偶数位或奇数位设置为一个且只有它们。例如:

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

69例如,数字。1000101是不正确的,因为只有三个奇数位设置为1

我尝试过使用不同的操作,^, &, >>, <<但我仍然不知道如何使用这些操作符来做到这一点。是的,我需要在C.

4

3 回答 3

5

这些数字具有 2 的幂的性质(x ^ (x >> 1)) + 1y如果是 2 的幂y & (y - 1) == 0

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

于 2012-10-13T19:28:07.393 回答
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;
}
于 2012-10-13T19:19:34.853 回答
1
bool isEven(int n){
   bool isEven = true;
   while(n){
      if( n & 1 ){
          isEven = !isEven;
      }
      n = n >> 1;
   }

   return isEven;
}

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

于 2012-10-13T19:15:00.653 回答