Если у вас есть арифметические операторы, такие как +
и -
в дополнение к побитовым AND (&
) и OR (|
), тогда вы можете сделать битовое XOR следующим образом:
int bitwise_XOR(int a, int b)
{
return (a + b) - (a & b) - (a & b);
}
Причина, по которой это работает, заключается в том, что мы делаем полное добавление, которое эквивалентно XOR, когда сумма для каждой заданной позиции бита <= 1, а затем мы исправляем случай, когда генерируется перенос (1 +1) вычитая <code>2 * (a & b).
Обратите внимание, что это работает, даже если промежуточные члены переполняются, предполагая, что у нас есть "нормально себя ведущие" целые числа (дополнение 2, обход по модулю 2 для переполнения и т.д.).