Этот алгоритм вычисляет для заданного i
, чье двоичное представление:
0..01XXXXXXX...XXXX
значение
0..011111111...1111
Это то, что делают операторы 5 |=
.
Затем в операторе возврата вычитается, что значение сдвинуто вправо на один бит
0..001111111...1111
чтобы получить результат
0..010000000...0000
Как это работает:
Максимально возможный 1 бит 32-й (самый левый) бит. Предположим, что входной номер имеет 1 в этом бите:
1XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Вы или это значение со смещением вправо на 1 (i >> 1)
и получите
11XXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Тогда вы или это новое значение со значением, сдвинутым вправо на 2 (i >> 2)
, и получите
1111XXXX XXXXXXXX XXXXXXXX XXXXXXXX
Тогда вы или это новое значение со значением, сдвинутым вправо на 4 (i >> 4)
, и получите
11111111 XXXXXXXX XXXXXXXX XXXXXXXX
Тогда вы или это новое значение со значением, сдвинутым вправо на 8 (i >> 8)
, и получите
11111111 11111111 XXXXXXXX XXXXXXXX
Наконец, вы или это новое значение со значением, сдвинутым вправо на 16 (i >> 16)
, и получите
11111111 11111111 11111111 11111111
Если старший 1 бит меньше 32-го, эти операции по-прежнему переводят все биты справа от него в 1 и сохраняют оставшиеся (старшие биты) 0.