C - 确定是否所有偶数位都设置为1

时间:2014-09-20 19:44:37

标签: c bit-manipulation puzzle

确定是否所有偶数位(从左到右计数)都设置为1.例如,0101 0101将计数,而1011 1000将不计数。

如果该位在所有偶数位置都为1,则返回1,否则返回0.

约束:必须只使用按位运算符。不能使用条件。您可以在表达式中使用的最大整数是0xFF

这是我的代码:

int allEvenBits(int X) {
    int x1 = !((X & 0x55) ^ 0x55);
    int x2 = !(((X >> 8) & 0x55) ^ 0x55);
    int x3 = !(((X >> 16) & 0x55) ^ 0x55);
    int x4 = !(((X >> 24) & 0x55) ^ 0x55);
    return x1 + x2 + x3 + x4;

}

以上内容返回1:1011 0010 1001 0010 1011 1001 1111 1111

如何修改它以使其与约束一起使用?

3 个答案:

答案 0 :(得分:5)

假设>>计为按位运算符,以下只需要16个常量。

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

答案 1 :(得分:0)

使用位移和按位 - 和:

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

如果我们有更大的常数,这将是最好的:

int f(unsigned x) {const unsigned mask = 0x55555555; return mask == (mask&x);}

答案 2 :(得分:0)

假设sizeof(int) == 4

int all_even(int x) {
    int all_even = (0x55<<24)|(0x55<<16)|(0x55<<8)|0x55;
    return x == ((x & ~all_even) | all_even);
}

读为&#34;如果我在x中设置了所有偶数位,那么这个新数字是否与x相同?&#34;