Я читал, что XOR эквивалентно добавлению мода 2. Однако я предполагаю, что это на уровне битов. Это означает, что 5 XOR 10 не равно (5 + 10) mod 2, потому что это будет 5, что неверно.
(5 + 10) mod 2 равно 1, а не 5, но этотакже не тот же результат, что и побитовый xor. Вы более или менее правильно сделали вывод, что утверждение применяется к отдельным битам, но ваш код предполагает, что вы, возможно, не полностью поняли это.
Побитовое XOR полностью эквивалентно добавлению мода 2 в циклическую группупорядка 2 , для которого добавление мода 2 является обычным оператором сложения. Эта группа имеет только два элемента, условно обозначенные 0 и 1. Добавление по модулю 2 не определено естественным образом для групп, не гомоморфных этому, хотя оно может быть расширено прямым способом. По совпадению, побитовое И эквивалентно умножению на элементы этой группы.
Учтите, что результатом сложения по модулю 2 всегда является либо 0, либо 1, в зависимости от того, имеют ли адденды одинаковую или разную четность соответственнои учтите, что выражение 1 << c
имеет нечетную четность тогда и только тогда, когда c
равно нулю, поэтому выражения вида A & (1 << c)
могут иметь нечетную четность только тогда, когда c
равно нулю (но фактическая четность зависит также отA
). Это должно показать вам, почему ваша программа не работает так, как вы ожидаете.
Вам необходимо сопоставить свои x
и y
с 0 и 1, чтобы выполнить вычисления. Есть несколько способов сделать это. Наиболее очевидный способ - выполнить побитовые сдвиги, как это уже описано в другом ответе. Для ваших конкретных целей вы также можете использовать двойное логическое отрицание, что в некоторых отношениях даже более естественно. А из-за симметрии задачи вы можете даже упростить это до одного отрицания:
x = !(A & (1 << c));
y = !(B & (1 << c));
o = (x + y) % 2;
output |= (o << c);