Вы делаете 64 суммы, по одной на каждый бит, для каждой из сумм, которые вы вычисляете, сумма mod n, это вычисление возвращает m для каждого бита, который должен быть установлен в результате, и 0 для каждого бита, который не должен быть установлен .
Пример:
n = 3, m = 2. list = [5 11 5 2 11 5 2 11]
5 11 5 2 11 5 2 11
sum of bit 0: 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 = 6 6 % 3 = 0
sum of bit 1: 0 + 1 + 0 + 1 + 1 + 0 + 1 + 1 = 5 5 % 3 = 2
sum of bit 2: 1 + 0 + 1 + 0 + 0 + 1 + 0 + 0 = 3 3 % 3 = 0
sum of bit 3: 0 + 1 + 0 + 0 + 1 + 0 + 0 + 1 = 3 3 % 3 = 0
Таким образом, устанавливается только бит 1, что означает, что результат равен 2.
Оптимизация реализации:
(Уловки и соображения, которые также полезны для реальных проблем)
Стоит отметить, что при итерации по массиву скорость выполнения в некоторой степени будет ограничена доступом к памяти, если требуется выполнить несколько операций с каждым элементом, обычно быстрее всего выполнить их все по одному элементу за раз, таким образом, Процессору нужно загрузить каждый элемент из памяти только один раз. Интересное сообщение в блоге о памяти и кеше.
Можно суммировать несколько битов в одно целое число, вместо применения 64 разных битовых масок, чтобы получить каждый бит самостоятельно, например, можно использовать только 4 битовые маски, каждая из которых извлекает 16 бит с 3 битами между ними, как до тех пор, пока не произойдет переполнения, нормальная операция сложения будет работать точно так же, как если бы она работала с 16 4-битными целыми числами, поэтому этот метод будет работать для 15 чисел. После того, как 15 чисел были обработаны таким образом, результаты должны быть добавлены в хранилище, способное содержать большие целые числа (может быть 8 64-разрядных целых, каждое из которых содержит 8 8-разрядных целых чисел, они, конечно, должны быть в свою очередь очищены в большие целые числа и т. Д.). ).
В результате вместо того, чтобы каждое значение выполняло 64 битовых маски, 63 битовых смещения и 64 добавления, нужно всего лишь 4 битовых маски, 3 битовых смещения и 4 добавления, плюс для каждых 15 значений 8 битовых масок, 4 битовых смещения и 8 сложений, плюс для каждых 255 значений 16 битовых масок, 8 битовых смещений и 16 дополнений и т. Д.
Визуализация:
(Суммирование 4x4-битных целых чисел с использованием 16-битных целых)
1000 1000 1000 1000 +
1000 0000 0000 1000 +
0000 0000 0000 1000 +
1000 1000 0000 0000 +
1000 0000 1000 0000 +
0000 0000 1000 1000 =
0010 0100 1100 0010
Результат одинаков, если вы считаете, что это 4 столбца 4-битных целых или 1 столбец 16-битного целого, это верно только до тех пор, пока 4-битные целые числа не переполняются.