Почему эти триггеры с XOR печатаются как OR? - PullRequest
0 голосов
/ 23 октября 2011

Здесь я пытаюсь реализовать 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 ]

3 голосов
/ 23 октября 2011
x ^= ~0; // too short to be submitted 
1 голос
/ 23 октября 2011

x ^ 1 << i совпадает с x ^ (1 << i). Таким образом, на каждой итерации цикла вы переключаете биты. Но ваш тест просто проверяет, что результат не равен нулю; это всегда верно, потому что ваше входное значение имеет более одного установленного бита.

Не ясно, чего вы пытаетесь достичь. Если вы просто хотите распечатать все биты по очереди, вы хотите x & 1 << i.

...