Операция XOR

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

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

Операция XOR

Сообщение Vadim » 21.05.2020 17:41:53

Кто мне расскажет, как в Паскале реализована операция XOR? Что-то я найти не могу... :-)
Vadim
долгожитель
 
Сообщения: 3889
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Pavia » 21.05.2020 18:43:37

В смысле? Открываем окно дизассемблера и смотрим.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 252
Зарегистрирован: 07.01.2011 12:46:51

Re: Операция XOR

Сообщение Vadim » 21.05.2020 18:54:46

Pavia
А если без ассемблера? :-)
Vadim
долгожитель
 
Сообщения: 3889
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение runewalsh » 21.05.2020 19:33:09

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

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

Если «как» не в смысле «что она делает», а в смысле «как», то это общепринятая ALU-операция наравне с AND/NOT/whatever.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 451
Зарегистрирован: 27.04.2010 00:15:25

Re: Операция XOR

Сообщение Vadim » 21.05.2020 19:53:12

runewalsh
Да нет, что XOR делает я знаю. Просто интересно, как именно эта операция в паскальных языках реализуется, на уровне кода. Вот, например, для комплексного числа:
Код: Выделить всё
operator + (z1, z2: complex) z: complex;
Begin
  z.re := z1.re + z2.re;
  z.im := z1.im + z2.im;
End;


Вот что-то подобное для XOR с целыми числами... :-)
Vadim
долгожитель
 
Сообщения: 3889
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Pavia » 21.05.2020 20:19:11

Код: Выделить всё
R:=A XOR B;
Аватара пользователя
Pavia
постоялец
 
Сообщения: 252
Зарегистрирован: 07.01.2011 12:46:51

Re: Операция XOR

Сообщение Vadim » 21.05.2020 20:20:30

Pavia
Не применение, а реализация.
Vadim
долгожитель
 
Сообщения: 3889
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение runewalsh » 21.05.2020 20:54:08

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

Re: Операция XOR

Сообщение Дож » 21.05.2020 20:54:47

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

(Реализовать её можно было бы через другие побитовые операции, например, формулой (A or B) and not (A and B), если бы было нужно.)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 843
Зарегистрирован: 12.10.2008 16:14:47

Re: Операция XOR

Сообщение Vadim » 21.05.2020 21:01:12

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

А вот это как раз интересно. Спасибо за подсказку. :-)
У меня тут такой интересный случай - операции XOR нету и ассемблер (мнемонический) недоступен.
Vadim
долгожитель
 
Сообщения: 3889
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Операция XOR

Сообщение Mirage » 23.05.2020 00:31:31

Иногда ее реализовывать нужно - множества почему-то не поддерживают такую операцию, хотя реализованы через битовые операции и в принципе с успехом их обычно заменяют.
Mirage
энтузиаст
 
Сообщения: 873
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Операция XOR

Сообщение Vadim » 23.05.2020 10:44:21

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

Re: Операция XOR

Сообщение runewalsh » 23.05.2020 17:17:26

Божечки, да всё они поддерживают через 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
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 451
Зарегистрирован: 27.04.2010 00:15:25

Re: Операция XOR

Сообщение Mirage » 24.05.2020 02:29:06

Увы, в дельфи такого оператора нет. А мне нужен кросскомпиляторный код.
Mirage
энтузиаст
 
Сообщения: 873
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Операция XOR

Сообщение Seenkao » 24.05.2020 12:48:52

Delphi 7, XOR работает, даже с Integer. Хотя не должен был...
Какую среду разработки используете?
Seenkao
новенький
 
Сообщения: 27
Зарегистрирован: 01.04.2020 03:37:12


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru