-1

Просматривая код, я увидел это.Побитовый оператор в выражении if

for(i=0; i<n; i++) 
{ 
    for(j=0; j<n; j++) 
    { 
    if(i & (1<<j)) 
     { 
     //code 
     } 
    } 
} 

Может ли кто-нибудь, как эта петля будет работать? Я знаю, что правая часть даст pow (2, j), но я не понимаю, как будет работать &.

+0

Обратите внимание, что этот код действителен только в том случае, если 'n

+0

хорошо, вы могли бы объяснить, как i & 2^j даст результат? – user3719526

ответ

1

Он перебирает все значения от 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, то он пытается сдвинуть значения слишком далеко, и это неопределенное поведение. Убедитесь, что этого не происходит.

Смежные вопросы