Логическое доказательство ассоциативного свойства для XOR

Я столкнулся с проблемой общего программирования: учитывая список целых чисел без знака, найдите одно целое число, которое встречается нечетным числом раз в списке. Например, если задан список:

{2,3,5,2,5,5,3}

решение будет состоять из целого числа 5, так как оно встречается 3 раза в списке, а другие целые числа - четное число раз.

Мое первоначальное решение включало настройку отсортированного массива, а затем итерацию через массив: для каждого нечетного элемента я бы добавил целое число, в то время как для каждого четного элемента я бы вычитал; конечная сумма была решением, так как другие целые числа будут отменены.

Однако я обнаружил, что более эффективное решение существует, просто выполняя XOR для каждого элемента - вам даже не нужен отсортированный массив! То есть:

2^3^5^2^5^5^3 = 5

Я вспоминаю из класса дискретных структур, я предположил, что ассоциированное свойство применимо к операции XOR и почему это решение работает:

a^a = 0

и

a^a^a = a

Хотя я помню, что ассоциативное свойство работает для XOR, у меня возникли проблемы с поиском логического доказательства этого свойства, специфичного для XOR (большинство логических доказательств в Интернете, похоже, больше сосредоточены на операциях AND и OR). Кто-нибудь знает, почему ассоциативное свойство применяется к операции XOR?

Я подозреваю, что он включает идентификатор XOR, содержащий AND и/или OR.

Ответ 1

Ассоциативное свойство говорит, что (a^b)^c = a^(b^c). Поскольку XOR побитовое (биты в числах обрабатываются параллельно), нам просто нужно рассмотреть XOR для одного бита. Тогда доказательство можно сделать, исследуя все возможности:

abc (a^b) (a^b)^c (b^c) a^(b^c)
000   0      0      0      0
001   0      1      1      1
010   1      1      1      1
011   1      0      0      0
100   1      1      0      1
101   1      0      1      0
110   0      0      1      0
111   0      1      0      1

Поскольку третий столбец (a^b)^c, идентичен пятому столбцу, a^(b^c), имеет место ассоциативное свойство.

Ответ 2

Пока a ^ b == ~a & b | a & ~b, вы можете прочесть это:

(a ^ b) ^ c = ~((~a & b) | (a & ~b)) & c | ((~a & b) | (a & ~b)) & ~c

и

a ^ (b ^ c) = a & ~((~b & c) | (b & ~c)) | ~a & ((~b & c) | (b & ~c))

Является равным.