我想检查 number 是否将所有偶数位或奇数位设置为一个且只有它们。例如:
数字42
是正确的,因为在二进制代码中101010
,它的所有且只有偶数位设置为1
。数21
也对,10101
。
69
例如,数字。1000101
是不正确的,因为只有三个奇数位设置为1
。
我尝试过使用不同的操作,^, &, >>, <<
但我仍然不知道如何使用这些操作符来做到这一点。是的,我需要在C
.
我想检查 number 是否将所有偶数位或奇数位设置为一个且只有它们。例如:
数字42
是正确的,因为在二进制代码中101010
,它的所有且只有偶数位设置为1
。数21
也对,10101
。
69
例如,数字。1000101
是不正确的,因为只有三个奇数位设置为1
。
我尝试过使用不同的操作,^, &, >>, <<
但我仍然不知道如何使用这些操作符来做到这一点。是的,我需要在C
.
这些数字具有 2 的幂的性质(x ^ (x >> 1)) + 1
。y
如果是 2 的幂y & (y - 1) == 0
因此,一项测试可能((x ^ (x >> 1)) + 1) & (x ^ (x >> 1)) == 0
适用于任何大小的数字。
#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;
}
bool isEven(int n){
bool isEven = true;
while(n){
if( n & 1 ){
isEven = !isEven;
}
n = n >> 1;
}
return isEven;
}
只要 n 为 != 0,while(n) 就会继续,它仍然有一个。如果第一位是一个,那么我们将偶数参数更改为相反的(偶数变为奇数,反之亦然),在每次迭代中,我们将第一个位向右移动。