array_index = hash_code & 15
эквивалентно (положительным значениям):
array_index = hash_code % 16
работает только в том случае, когда все значащие биты числа равны единице (то есть, когда число имеет форму 2**n - 1
).
И то, и другое удаляет наибольшую часть числовых битов.
Битовая маскировка выполняется намного быстрее, чем деление.Поэтому он используется, когда это возможно, для ускорения вычислений.Каждый раз, когда вы видите:
b = a % modulo
с a > 0
и modulo
- это степень 2 (modulo == 2**n
), вы можете написать:
b = a & (modulo-1)
.Если модуль не является степенью 2, то это невозможно сделать таким образом (и оптимизаторы скомпилированных языков часто заменяют степень 2 по модулю или делению / умножению на более быструю операцию маскирования / сдвига битов)