2012-10-13 47 views
3

我想检查数字是否将所有偶数位或奇数位设置为1并且只有它们。对于例如:检查数字中的偶数或奇数位'

42是正确的,因为在二进制代码101010它拥有一切,只有偶数位集来1。 号码21也是正确的,。

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

我试过使用不同的操作与^, &, >>, <<,我仍然不知道如何使用这些操作符来做到这一点。是的,我需要在C中使用逻辑运算符来执行此操作。

+0

要判断一个数字是奇数还是偶数,只需要检查* last *位。 – meagar

+0

你这样做的目的是什么? –

+0

[相关](http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer) –

回答

5

这些数字有一个属性,(x^(x >> 1)) + 1是2和y功率为2,如果y & (y - 1) == 0

这样一个测试可能是((x^(x >> 1)) + 1) & (x^(x >> 1)) == 0这会为任何规模的数字工作的动力。

+0

是的,就是这样!谢谢。 –

+0

这很好,但是将'(x ^(x >> 1))'存储在一个单独的变量y中会更好,因为程序不需要重新计算该表达式的值了 –

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

    return isEven; 
} 

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

+3

发布代码没有帮助,请在1或2行解释。 – zengr

+0

这并不回答被问到的问题。这将检查该数字是否设置了偶数或奇数位。问题是要检查所有奇数编号的位是否已设置,或者是否设置了所有已编号的位。 – Lindydancer

+0

opps将解决它,谢谢。 – roni

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

如果人们开始评论(或更正)空白,非空白必须是正确的;-) – wildplasser

+0

0可能被认为是一个特例,因为它根本没有位。 (但至少它没有*错误的*位设置;-)根据要求,你当然可以单独排除零。 – wildplasser