return x == (x & -x);
Этот ответ работает из-за способа обозначения дополнения до двух.
Во-первых, пример.Предположим, у нас есть 8-битные целые числа со знаком.
00010000 = 16
11110000 = -16
Побитовое значение и в результате вы получите 00010000
, равное вашему исходному значению!Это работает потому, что при отрицании в дополнении 2 сначала инвертируйте все биты, а затем добавьте 1. У вас будет куча нулей и куча переносов, пока единица не встанет на свое место.Битовая, а затем проверяется, установлен ли правильный бит.
В случае числа, которое не является степенью двойки:
00101010 = 42
& 11010110 = -42
----------
00000010 != 42
Ваш результат все равно будет иметь толькоодин бит, но он не будет соответствовать исходному значению.Поэтому в вашем исходном значении было установлено несколько битов.
Примечание: Этот метод возвращает true для 0, что может быть или не быть желательным.