Вот что это означает:
- Начальная
x
часть означает x != 0
(x & (x-1))
часть означает «x
не является степенью двойки» (т.е. равен нулю или имеет более чем один набор битов)
- выражение
!(x & (x-1))
означает «x
является степенью двух»
Поэтому , общее выражение означает, что «x
- это положительная сила двух».
Чтобы узнать, почему x & (x-1)
поможет вам найти полномочия двух, рассмотрите, что происходит с числами, которые имеют один бит, установленный по сравнению с числами, которые имеют два или более бит. Ряд с одним битом, когда декрементируется, будет производить последовательность, которая выглядит следующим образом:
000100000..000 <== x
000011111..111 <== x-1
При применении побитового-и пары чисел, как это, вы получаете ноль, потому что единственный бит, был установлен в x
, теперь равен нулю, и все биты, установленные в x-1
, были нулями в x
.
Когда число имеет набор двух или более битов, то картина будет выглядеть следующим образом:
010100000..000 <== x
010011111..111 <== x-1
Теперь последний бит, который был установлен будет сброшен, но все биты впереди него остались бы установить в 1
, создавая ненулевой шаблон, когда «AND» -ed с исходным значением x
.
Это недопустимо C#. – Lee
Скомпилирует ли этот код? Я удивлен, что x определяется как int, но оценивает bool ... (т. Е. Первый x, перед &&) – adv12
Является ли это C/C++? Именование метода camelCase и отсутствие символа 'unsigned' довольно странно. –