Во-первых, давайте предположим, что проблема связана с логическими значениями, а не целыми числами.
Тогда способ увидеть проблему состоит в том, что у нас есть несколько логических значений в верхней части подматрицы, которая нас интересует, и некоторые логические значения в левой части. Затем, если вертикальные линии нарисованы для верхних логических значений, которые имеют значение True, а горизонтальные линии нарисованы для боковых логических значений, которые являются истинными:
введите описание изображения здесь
Затем задача состоит в том, чтобы подсчитать количество пересечений и определить, четное ли это число (результат: ноль) или нечетное (результат: один).
Теперь это более очевидно что это можно сделать, не считая их один за другим, это можно сделать, умножив количество истинных логических значений вверху на количество истинных логических значений вдоль стороны. Фактически, мы можем использовать побитовое И для этих чисел, так как младший значащий бит произведения совпадает с младшим значащим битом И для чисел.
* 1013 количество логических значений True в диапазоне X..Z и Y..T.
Чтобы решить полную проблему, сделайте это для всех 32 битов целых чисел. Конечно, для этого есть ярлык, потому что полные подсчеты не нужны (только младший значащий бит подсчетов), и ни то, ни другое не являются полными продуктами.
Возможно, вы предпочитаете более алгебраическое c объяснение , то способ увидеть это заключается в том, что мы используем тот факт, что AND распределяет по XOR для перезаписи a&d ^ a&e ^ a&f ^ b&d ^ b&e ^ b&f ^ c&d ^ c&e ^ c&f
(пример 3x3) в (a ^ b ^ c) & (d ^ e ^ f)
.
В общем,
horizontal = XOR of list[X .. Z]
vertical = XOR of list[Y .. T]
result = horizontal & vertical