Как сравнить двухбитные значения в C? - PullRequest
1 голос
/ 20 сентября 2011

Я немного поболтал с C и обнаружил, что возможность напрямую манипулировать битами является увлекательной и мощной (и, я полагаю, опасной). Мне было любопытно, как будет лучше сравнивать разные биты в Си. Например, число 15 представляется в двоичном виде как:

00001111

А число 13 представляется как:

00001101

Как бы вы сравнили, какие биты отличаются, не считая их? Было бы легко использовать сдвиги, чтобы определить, что 15 содержит 4 1 с, а 13 содержит 3 1 с, но как бы вы вывели разницу между этими двумя значениями (за исключением того, что точка 2 ^ 1 отличается между двумя)? Я просто не могу придумать простой способ сделать это. Любые указатели будут высоко оценены!

РЕДАКТИРОВАТЬ: Я должен был уточнить, что я знаю, XOR является правильным способом решения этой проблемы, но у меня была проблема с реализацией. Я предполагаю, что моя проблема сравнивала один бит за раз (и не генерировала разницу за слово). Решение, которое я придумал:

 void compare(int vector1, int vector2) {         
     int count = 0; 
     unsigned int xor = vector1 ^ vector2;

     while (count < bit_length) {
          if (xor % 2 == 1) { //would indicicate a difference
               printf("%d ", count);
          }
          xor >>= 1; 
          count++;
      }  
 }

1 Ответ

15 голосов
/ 20 сентября 2011

Использовать побитовые операции:

c         = a         ^ b        ;
00000010b = 00001111b ^ 00001101b;

Что ^ или XOR делает:

0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1
1 ^ 1 = 0

Один из способов думать об этом:

Если два операнда (a и b) различны, результатом будет 1.
Если они равны, результат равен 0.

...