Строка:
for (x=1; x < (1 << n); x++)
инициализирует x в 1 и повторяется / повторяется до x <(1 сдвинут влево на n).Сдвиг влево в основном перемещает двоичное представление 1 левого n двоичных пространств.Итак, 0001 будет 0010 после сдвига влево на 1 - это похоже на умножение на 2 ^ n.х затем увеличивается на 1 (х ++).В конечном итоге увеличение x должно в конечном итоге привести к прекращению цикла из-за условия x <(1 << n). </p>
(x&x-1)%3
говорит "Остаток значения x (двоичное и) значение x-1 разделенона 3. Итак, если x равен 4, и мы используем 4-битное число (глупо, я знаю, но оно показывает смысл):
0100 &
0011
_______
0000 (binary and means both spots being added are 1, none are here).
= 0
0/3 = 0 R 0 - no remainder here, so print 0.
Следующее утверждение:
(x|x-1)+1)%3
Говорит x (двоичный или) x-1, с добавленным к этому значению значением 1. Вся сумма там модифицируется на 3, что снова погружает ее на 3 и берет остаток, поэтому, если x снова равно 4, и мыИспользование 4-битных целых чисел:
0100 |
0011
_______
0111 (Binary or means either binary number has a 1 in that slot).
= 4 + 2 + 1 = 7 --> 7 mod 3 = 7 / 3 --> 2 R 1, print remainder of 1 here.
printf позволяет форматировать печать из списка аргументов переменной длины, которые могут быть выражениями, поэтому здесь будет напечатано:
move from tower 0 to tower 1 <new line>
Замена%я с нашими ответами.