我想检查数字是否将所有偶数或奇数位设置为1并且仅将它们设置为1。例如:
数字42
是正确的,因为在二进制代码101010
中,它具有全部且仅偶数位设置为1
。
数字21
也是正确的,10101
。
例如69
。 1000101
不正确,因为1
只有三个奇数位集。
我尝试使用^, &, >>, <<
进行不同的操作,但我仍然不知道如何使用这些运算符执行此操作。是的,我需要使用C
中的逻辑运算符来执行此操作。
答案 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参数更改为相反(甚至变为奇数,反之亦然),在每次迭代时我们将数字向右移一位。