Он перебирает все значения от 0
до n
, и для каждого из них:
Он перебирает каждый бит в значении. если значение установлено:
Он выполняет //code
Позволяет исследовать сложную часть:
if(i & (1<<j))
1<<j
является распространенным способом установить j
-й бит (начиная с нуля). Если j==0
, то это 0b00001
, если j==3
, то это 0b01000
. Затем i & <bit>
оценивает <bit
> если этот бит установлен в i
, а в противном случае он будет равен 0
. Таким образом, это проверяет, установлен ли j
-й бит в i
.
пар значений, которые запускают код, таковы:
i binary js
0 000
1 001 0
2 010 1
3 011 0, 1
4 100 2
5 101 0, 2
6 110 1, 2
etc...
31 11111 0, 1, 2, 3, 4,
Обратите внимание, как 1s в двоичном зеркаладмпульс J значения, для которых код триггеров.
Обратите внимание, что если n>=32
, то он пытается сдвинуть значения слишком далеко, и это неопределенное поведение. Убедитесь, что этого не происходит.
Обратите внимание, что этот код действителен только в том случае, если 'n
хорошо, вы могли бы объяснить, как i & 2^j даст результат? – user3719526