Если вы нарисуете двоичные представления на ручке и бумаге, вы увидите, что (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
).