Операция XOR
Модератор: Модераторы
Операция XOR
Кто мне расскажет, как в Паскале реализована операция XOR? Что-то я найти не могу... 
В смысле? Открываем окно дизассемблера и смотрим.
Pavia
А если без ассемблера?
А если без ассемблера?
Она побитово ксорит числа:
13₁₀ = 1101₂
23₁₀ = 10111₂
13₁₀ xor 23₁₀ = (0)1101₂ xor 10111₂ = 11010₂ = 26₁₀
Это можно интерпретировать как флипание в одном из чисел битов, соответствующих выставленным в другом:
10110010 10101010₂ xor
00111111 11000000₂ =
10001101 01101010₂.
Если «как» не в смысле «что она делает», а в смысле «как», то это общепринятая ALU-операция наравне с AND/NOT/whatever.
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
Да нет, что XOR делает я знаю. Просто интересно, как именно эта операция в паскальных языках реализуется, на уровне кода. Вот, например, для комплексного числа:
Вот что-то подобное для XOR с целыми числами...
Да нет, что XOR делает я знаю. Просто интересно, как именно эта операция в паскальных языках реализуется, на уровне кода. Вот, например, для комплексного числа:
Код: Выделить всё
operator + (z1, z2: complex) z: complex;
Begin
z.re := z1.re + z2.re;
z.im := z1.im + z2.im;
End;Вот что-то подобное для XOR с целыми числами...
Код: Выделить всё
R:=A XOR B;Pavia
Не применение, а реализация.
Не применение, а реализация.
>это общепринятая ALU-операция наравне с AND/NOT/whatever
— подразумевает, что запись A xor B, где A, B: integer, напрямую мапится в соответствующую процессорную операцию. Обычно её ассемблерная мнемоника так и записывается — xor <регистр>, <регистр или непосредственное значение>. Ты бы ещё спросил, как сложение integer'ов реализовано.
— подразумевает, что запись A xor B, где A, B: integer, напрямую мапится в соответствующую процессорную операцию. Обычно её ассемблерная мнемоника так и записывается — xor <регистр>, <регистр или непосредственное значение>. Ты бы ещё спросил, как сложение integer'ов реализовано.
Vadim, все основные процессоры нативно поддерживают XOR. Паскаль не реализует её сам, а использует готовую инструкцию.
(Реализовать её можно было бы через другие побитовые операции, например, формулой (A or B) and not (A and B), если бы было нужно.)
(Реализовать её можно было бы через другие побитовые операции, например, формулой (A or B) and not (A and B), если бы было нужно.)
Дож писал(а):(Реализовать её можно было бы через другие побитовые операции, например, формулой (A or B) and not (A and B), если бы было нужно.)
А вот это как раз интересно. Спасибо за подсказку.
У меня тут такой интересный случай - операции XOR нету и ассемблер (мнемонический) недоступен.
Mirage
Да, я как раз подшаманил немного это дело, применяя работу с множествами. Потестировал - вроде результаты от паскалевских целочисленных не отличаются...
Да, я как раз подшаманил немного это дело, применяя работу с множествами. Потестировал - вроде результаты от паскалевских целочисленных не отличаются...
Божечки, да всё они поддерживают через 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
Delphi 7, XOR работает, даже с Integer. Хотя не должен был...
Какую среду разработки используете?
Какую среду разработки используете?
