为什么这个带XOR打印的flipallbits像OR一样?

时间:2011-10-23 14:31:49

标签: c bitwise-operators

这里我试图实现XOR(^)来翻转数字中的所有位。但由于某种原因,它打印出所有1,就好像XOR(^)实际上是一个OR(|)。我似乎无法理解为什么。我看了一下运算符优先级,但我不知道这会如何真正有所作为。

#include <stdio.h>
#include <stdlib.h>

void flipallbits(int x) {
  int i;
  for( i = 31; i >= 0; i--) {
    if( x ^ 1 << i ) {
      printf("1");
    } else {
      printf("0");
    }
  }
  printf("\n");
}

int main() {
  int num = 6541;
  flipallbits(num);
}

2 个答案:

答案 0 :(得分:3)

x ^= ~0; // too short to be submitted 

答案 1 :(得分:1)

x ^ 1 << ix ^ (1 << i)相同。因此,在循环的每次迭代中,您都会翻转不同的位。但是你的测试只是检查结果是否为零;这总是正确的,因为您的输入值设置了多个位。

目前尚不清楚你想要实现的目标。如果您只想依次打印所有位,则需要x & 1 << i