首页 > 解决方案 > evenBitParity - 如果 x 的偶数索引位中有奇数个为 0,则返回 1(x 的第 0 位是 1 的位置)

问题描述

这是一个有点操纵的问题。

/*
evenBitParity - returns 1 if an odd number of the even-indexed bits of x are 0's (bit 0 of x is the 1's place)
  Examples:
    evenBitParity(0) = 0 (16 zero even-indexed bits),
    evenBitParity(2) = 0 (16 zero even-indexed bits, bit 1 is non-zero but not even-indexed)
    evenBitParity(3) = 1 (15 zero even-indexed bits),
    evenBitParity(5) = 0 (14 zero-indexed bits),
    evenBitParity(7) = 0
    evenbitParity(21) = 1
  Legal ops: ! ~ & ^ | + << >>
  Max ops: 15
  Rating: 4
*/
int evenBitParity(int x) {

}

我尝试用下面的代码来解决它,但是操作太多所以我没有得到充分的信任。谁能为此提供更好的解决方案?非常感谢!

int masker = (0x55 << 8)+0x55;
masker = (masker<<16)+masker;
x = x&masker;
x = x ^ (x >> 1);
x = x ^ (x >> 2);
x = x ^ (x >> 4);
x = x ^ (x >> 8);
x = x ^ (x >> 16);
return x&1;

标签: bit

解决方案


自己试试这个。改进后的版本是 ebp2();

你不需要使用面具和所有这些。只需省略第一个移位即可忽略所有奇数索引位。

我认为我应该为我的努力喝一杯啤酒或至少一杯咖啡。

int main(int argc, char** argv){
    int x;
    x = 0;
    printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x)); 
    x = 2;
    printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x)); 
    x = 3;
    printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x)); 
    x = 5;
    printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x)); 
    x = 7;
    printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x)); 
    x = 21;
    printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x)); 
}

int ebp1(int x){
    int masker = (0x55 << 8)+0x55;
    masker = (masker<<16)+masker;
    x = x&masker;
    x = x ^ (x >> 1);
    x = x ^ (x >> 2);
    x = x ^ (x >> 4);
    x = x ^ (x >> 8);
    x = x ^ (x >> 16);
    return x&1;
}

int ebp2(int x){
    x = x ^ (x >> 2);
    x = x ^ (x >> 4);
    x = x ^ (x >> 8);
    x = x ^ (x >> 16);
    return x&1;
}

推荐阅读