Операция XOR

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Операция XOR

Сообщение Vadim »

Кто мне расскажет, как в Паскале реализована операция XOR? Что-то я найти не могу... :-)
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Re: Операция XOR

Сообщение Pavia »

В смысле? Открываем окно дизассемблера и смотрим.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Vadim »

Pavia
А если без ассемблера? :-)
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Операция XOR

Сообщение runewalsh »

Она побитово ксорит числа:
13₁₀ = 1101₂
23₁₀ = 10111₂
13₁₀ xor 23₁₀ = (0)1101₂ xor 10111₂ = 11010₂ = 26₁₀

Это можно интерпретировать как флипание в одном из чисел битов, соответствующих выставленным в другом:
10110010 10101010₂ xor
00111111 11000000₂ =
10001101 01101010₂.

Если «как» не в смысле «что она делает», а в смысле «как», то это общепринятая ALU-операция наравне с AND/NOT/whatever.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Vadim »

runewalsh
Да нет, что XOR делает я знаю. Просто интересно, как именно эта операция в паскальных языках реализуется, на уровне кода. Вот, например, для комплексного числа:

Код: Выделить всё

operator + (z1, z2: complex) z: complex;
Begin
  z.re := z1.re + z2.re;
  z.im := z1.im + z2.im;
End;


Вот что-то подобное для XOR с целыми числами... :-)
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Re: Операция XOR

Сообщение Pavia »

Код: Выделить всё

R:=A XOR B;
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Vadim »

Pavia
Не применение, а реализация.
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Операция XOR

Сообщение runewalsh »

>это общепринятая ALU-операция наравне с AND/NOT/whatever
— подразумевает, что запись A xor B, где A, B: integer, напрямую мапится в соответствующую процессорную операцию. Обычно её ассемблерная мнемоника так и записывается — xor <регистр>, <регистр или непосредственное значение>. Ты бы ещё спросил, как сложение integer'ов реализовано.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Re: Операция XOR

Сообщение Дож »

Vadim, все основные процессоры нативно поддерживают XOR. Паскаль не реализует её сам, а использует готовую инструкцию.

(Реализовать её можно было бы через другие побитовые операции, например, формулой (A or B) and not (A and B), если бы было нужно.)
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Vadim »

Дож писал(а):(Реализовать её можно было бы через другие побитовые операции, например, формулой (A or B) and not (A and B), если бы было нужно.)

А вот это как раз интересно. Спасибо за подсказку. :-)
У меня тут такой интересный случай - операции XOR нету и ассемблер (мнемонический) недоступен.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Re: Операция XOR

Сообщение Mirage »

Иногда ее реализовывать нужно - множества почему-то не поддерживают такую операцию, хотя реализованы через битовые операции и в принципе с успехом их обычно заменяют.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Vadim »

Mirage
Да, я как раз подшаманил немного это дело, применяя работу с множествами. Потестировал - вроде результаты от паскалевских целочисленных не отличаются... :-)
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Операция XOR

Сообщение runewalsh »

Божечки, да всё они поддерживают через operator ><.

Код: Выделить всё

type
   MyItem = (ItemA, ItemB, ItemC);
   MyItems = set of MyItem;

var
   a, b, aXORb: MyItems;
   it: MyItem;

begin
   a := [ItemA, ItemB];
   b := [ItemB, ItemC];
   aXORb := a >< b;
   for it in aXORb do writeln(it);
end.

ItemA
ItemC
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Re: Операция XOR

Сообщение Mirage »

Увы, в дельфи такого оператора нет. А мне нужен кросскомпиляторный код.
Seenkao
энтузиаст
Сообщения: 563
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Операция XOR

Сообщение Seenkao »

Delphi 7, XOR работает, даже с Integer. Хотя не должен был...
Какую среду разработки используете?
Ответить