Есть кусок кода:
int p(char *a, char*b) { while (*a | *b) { if (*a ^ *b) //... } }
и я действительно не знаю, что он делает.
Редактировать: я понимаю, что делают операторы | и ^, я просто не знаю, что они будут делать со значениями char.
|
^
char
Хотя в строке 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++; }
Он рассматривает их как маленькие целые числа. | Затем оператор выполняет ИЛИ, а оператор ^ - XOR (исключающее или) для отдельных битов, составляющих целые числа. Ни одна из этих операций не особенно полезна для большинства символьных приложений, но их можно использовать (например) для добавления бита четности в символ при программировании связи.
| - оператор побитового ИЛИ. ^ - побитовый оператор XOR:
10101010 11010101 | 01010100 ^ 11111110 ========== ========== 11111110 00101011
Хотя char может использоваться для представления символов, это по сути целочисленный тип данных. Он хранит двоичное число (как и все остальное в двоичном цифровом компьютере).
Код просто означает:
while (*a != '\0' && *b != '\0') if (*a != *b)
Разработчик хотел быть умным, используя битовые операторы с символами
В этом случае char просто интерпретируется как число, а | и ^ - побитовые операторы OR и XOR соответственно.
Они будут рассматриваться как двоичное представление. Обычно это означает 1 байт без знака. Не подходит для всех архитектур!
(*a|*b) означает либо *a или *b, либо оба содержат что-то кроме '\ 0'
(*a|*b)
*a
*b
(*a^*b) означает, что два символа не идентичны.
(*a^*b)
| = Побитовое ИЛИ (включая ИЛИ)
^ = Побитовое XOR (исключающее ИЛИ)
Это оператор XOR, что означает «исключающее ИЛИ». Он работает поразрядно.
за каждый бит в вашем элементе:
0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0