C #. Логическая загадка с битовыми операциями. Только один бит установлен? - PullRequest
5 голосов
/ 07 января 2011

Это должно быть легко для людей C ++. Но меня спросили, как это сделать в C #. Не должно быть большой разницы.

Как узнать, установлена ​​ли для длинной переменной только один бит?

Я не могу думать ничего, кроме какой-то жестокой силы, сдвигающей все биты и считающей то, что установлено.

Ответы [ 3 ]

20 голосов
/ 07 января 2011

Неотрицательное двоичное целочисленное значение x является степенью 2, если (x&(x-1)) равно 0, используя арифметику дополнения 2.

Сила 2 означает, что установлен один бит.

http://aggregate.org/MAGIC/#Is%20Power%20of%202

EDIT:

Чтобы учесть нулевой регистр:

bool singleBit = x>0 && (x&(x-1))==0
3 голосов
/ 07 января 2011

В C ++:

unsigned long v;
bool f; // result
f = v && !(v & (v - 1));

Объяснение: v & (v - 1) == 0, если установлен только один бит, или v == 0.

0 голосов
/ 10 апреля 2012

Только что попробовал в PHP:

$singleBit = $bits && !($bits & ($bits - 1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...