Проверка, установлены ли все биты в k от 1 до n - PullRequest
3 голосов
/ 04 сентября 2011

Я читал один вопрос в блоге, и решение вопроса состояло в том, чтобы проверить, установлены ли от 1 до n битов в 'k' или нет.

Например

  • k = 3 и n = 2;затем «True», поскольку 1-й и 2-й бит устанавливаются в k

  • k = 3 и n = 3;тогда «Ложь», поскольку 3-й бит в k не установлен,Может ли кто-нибудь помочь мне понять это?

1 Ответ

10 голосов
/ 04 сентября 2011

Если вы нарисуете двоичные представления на ручке и бумаге, вы увидите, что (1 << (n-1)) всегда устанавливает один бит в 1 (n -й бит), тогда как (1 << n) - 1 устанавливает первое n бит.

Это битовые маски ; они используются для управления определенными разделами ввода (k) с помощью побитовых операций (&, | и ^).

Примечание

Я думаю, что пример излишне сложен. Этого должно быть достаточно:

if ((k & ((1 << n) - 1)) == ((1 << n) - 1))
    ...

Или чтобы сделать его еще чище:

unsigned int mask = (1 << n) - 1;
if ((k & mask) == mask)
   ...

(при условии, что k имеет тип unsigned int).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...