C: каков результат операции I и ^ на char? - PullRequest
0 голосов
/ 16 июня 2009

Есть кусок кода:

int p(char *a, char*b)
{
  while (*a | *b) 
  {
   if (*a ^ *b)
    //...
  }
}

и я действительно не знаю, что он делает.

Редактировать: я понимаю, что делают операторы | и ^, я просто не знаю, что они будут делать со значениями char.

Ответы [ 8 ]

8 голосов
/ 16 июня 2009

Хотя в строке a или строке b не заканчиваются символы, проверьте, не отличаются ли они.

int p(char *a, char*b)
{
     // While both string a and string b have characters left
     // note this assumes they are both zero terminated
     // and if not the same length they have trail zeros
     while (*a|*b)  
     {
         // check to see if the character is different
         // this is done via the xor
         if (*a^*b)
              //(...)
         }

         // should increment pointers or will never exit the loop
         // a++;
         // b++;
      }
6 голосов
/ 16 июня 2009

Он рассматривает их как маленькие целые числа. | Затем оператор выполняет ИЛИ, а оператор ^ - XOR (исключающее или) для отдельных битов, составляющих целые числа. Ни одна из этих операций не особенно полезна для большинства символьных приложений, но их можно использовать (например) для добавления бита четности в символ при программировании связи.

4 голосов
/ 16 июня 2009

| - оператор побитового ИЛИ. ^ - побитовый оператор XOR:

    10101010      11010101  
  | 01010100    ^ 11111110
  ==========    ==========
    11111110      00101011

Хотя char может использоваться для представления символов, это по сути целочисленный тип данных. Он хранит двоичное число (как и все остальное в двоичном цифровом компьютере).

2 голосов
/ 16 июня 2009

Код просто означает:

while (*a != '\0' && *b != '\0')
   if (*a != *b)

Разработчик хотел быть умным, используя битовые операторы с символами

2 голосов
/ 16 июня 2009

В этом случае char просто интерпретируется как число, а | и ^ - побитовые операторы OR и XOR соответственно.

0 голосов
/ 16 июня 2009

Они будут рассматриваться как двоичное представление. Обычно это означает 1 байт без знака. Не подходит для всех архитектур!

(*a|*b) означает либо *a или *b, либо оба содержат что-то кроме '\ 0'

(*a^*b) означает, что два символа не идентичны.

0 голосов
/ 16 июня 2009

| = Побитовое ИЛИ (включая ИЛИ)

^ = Побитовое XOR (исключающее ИЛИ)

0 голосов
/ 16 июня 2009

Это оператор XOR, что означает «исключающее ИЛИ». Он работает поразрядно.

за каждый бит в вашем элементе:

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

...