((n & (n-1)) == 0)
Проверяет, является ли значение «n» степенью 2.
Пример:
if n = 8, the bit representation is 1000
n & (n-1) = (1000) & ( 0111) = (0000)
So it return zero only if its value is in power of 2.
The only exception to this is ‘0’.
0 & (0-1) = 0 but ‘0’ is not the power of two.
Почему это имеет смысл?
Представьте, что происходит, когда вы вычитаете 1 из строки битов. Вы читаете слева направо,
поворачивая каждый 0 на 1, пока не достигнешь 1, в этот момент этот бит переворачивается:
1000100100 -> (вычесть 1) -> 1000100011
Таким образом, каждый бит, вплоть до первой 1, переворачивается. Если в номере ровно одна единица, то каждый бит (кроме начальных нулей) будет перевернут. Таким образом, n & (n-1) == 0, если есть ровно один 1. Если есть ровно один 1, то это должно быть степень двух.