IgGass
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору MakssWay Операция "i >>= 1" эквивалентна "i=i>>1" , т.е., берется бинарное представление i, делается один сдвиг вправо , т.е., например, 3 (0000...00011) переходит в (0000...00001). Результат присваивается i. Обрати внимание, что в данном случае используются unsigned int, это означает, что все биты int используются для представления величины числа (в обычном int первый бит используется для сохранения знака). Операция & это побитовый and между двумя int. Бинарное представление 1 это 0000...0001. Таким образом 3&1 и 1&1 отличны от нуля (и в первом, и во втором случае результат 0000...0001). В свою очередь условие !(i & 1) окажется верным лишь для четных i, поскольку, для любых нечетных последний бит будет 1, так что весь результат будет отличен от нуля, и его negation не даст 1. Поэтому для i=1 и i=3 disk_number будет 1, т.к. мы не разу не зайдем в while, а для i=2 мы зайдем лишь один раз (и увеличим disk_number на 1), поскольку первый же сдвиг вправо переводит 2 в 1.
---------- "Тот, кто щадит врага, не щадит самого себя." Фрэнсис Бэкон |
|