Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Наложение гаммы на число

Автор: 18192123 24.03.2009 14:05

Здравствуйте!
Скажите пожалуйста, как произвести XOR между двумя числами типа __int64, если отксорить требуется определённое число разрядов?
например, 0xB5F2A8D63D2F0FB и 0x74726571, т.е каждый из разрядов из последнего числа нужно отксорить с соответствующими из 1-го..как только 2-е число заканчивается, XOR прекращается.


Автор: volvo 24.03.2009 14:31

Я тебе вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=23892&view=findpost&p=131796 уже показывал, как соорудить маску. Так вот просто XOR-ишь, и накладываешь эту самую маску, чтобы отсечь лишние старшие разряды.

Автор: Lapp 24.03.2009 14:37

Цитата(18192123 @ 24.03.2009 10:05) *
каждый из разрядов из последнего числа нужно отксорить с соответствующими из 1-го..как только 2-е число заканчивается, XOR прекращается.
Что значит "прекращается"? Это значит, что остальные (верхние) разряды результата - нули? или такие же, как в первом? или единицы?
Определи операцию корректно. Просто "прекратить" невозможно. Результат должен быть чем-то заполнен до конца.

Автор: 18192123 28.03.2009 20:58

Цитата(Lapp @ 24.03.2009 10:37) *

Результат должен быть чем-то заполнен до конца.

Почему должен?
Мне как раз и нужно, чтобы в результате осталось столько разрядов, сколько было во 2-м числе.

Автор: Lapp 29.03.2009 11:13

Цитата(18192123 @ 28.03.2009 16:58) *
Почему должен?
Мне как раз и нужно, чтобы в результате осталось столько разрядов, сколько было во 2-м числе.
Потому что количество разрядов фиксировано (и равно в данном случае 64). Если ты говоришь про значащие разряды, то поведай об этом миру smile.gif.

Ты сказала, что делать с нижними разрядами (XOR). С верхними осталось непонятным. Что означает "прекратить"? Прекратить XOR нельзя, он выполняется за один такт. Ты, по всей видимости, подразумеваешь модель, в которой операция (XOR) выполняется побитно, начиная с младшего разряда. Тогда "прекратить" может означать:
1. оставить как в первом операнде (в твоем примере - 0xB5F2A8D);
2. оставить как во втором операнде (нули).

На будущее имей в виду, что если ты оперируешь с чилами определенного формата, то и оба операнда, и результат должны быть этого формата. И если верхние биты присутствуют, то надо их так или иначе определять. И даже если их значение тебе неважно (может быть любым), то так и скажи - это и будет определением. Ничего не сказать - нельзя.