Искусство компьютерного программирования, том 4, опечатка 2 опечатка?

Внизу страницы 5 есть фраза "меняет k на k ⊕ (1j+1)2". Разве 1 ​​в любой степени еще 1 даже в двоичном? Я думаю это опечатка. Я послал электронное письмо доктору Кнуту, чтобы сообщить об этом, но не ожидаю ответа в течение нескольких месяцев. А пока я пытаюсь понять, что это должно быть.

2 ответа

Решение

Это может быть решено с использованием соглашения, что (...)2 представляет побитовое представление. (1j+1)2 тогда состоит исключительно из j+1 единиц, а не относится к возведению в степень. Вы можете увидеть это соглашение более подробно объясненным в TAOCP Volume 4 Fascicle 1 на странице 8, например:

Если x - почти любое ненулевое 2-адическое целое число, мы можем записать его биты в виде

х = (g01a10b)2

иными словами, x состоит из некоторой произвольной (но бесконечной) двоичной строки g, за которой следует 0, за которой следуют единицы + 1, за которыми следуют b нулей, для некоторых a >= 0 и b> = 0.

[Я заменил символ альфа на g, чтобы сохранить проблемы с кодировкой]

Возвращаясь к исходному запросу; k ⊕ (1j+1)2 приравнивается к k ⊕ (2j+1 - 1), подразумевая, что (1j+1)2 = (2j+1 - 1): это верно, потому что левая часть целое число, значащие биты которого j+1 (смежные); правая часть - возведение в степень. Например, с j = 3:

(14)2 = (1111)2 = (24 - 1)

Надеюсь, это поможет.

Список известных опечаток можно найти на странице с ошибками:

http://www-cs-faculty.stanford.edu/~knuth/taocp.html

Ваша заявленная опечатка не там. Если это действительно опечатка, вы можете получить денежное вознаграждение от самого Кнута.

Другие вопросы по тегам