Представьте себе байт в двоичном виде: 11001001. В шестнадцатеричной системе это C9, причём C это та часть, которая 1100, а 9 это 1001. С десятичной системой так красиво не получается, если что.

Так вот перед вами стоит задача из 4 таких байтов получить по 4 разряда с правой стороны, а затем собрать эти 16 бит в двухбайтовое слово, т.е. из C9 C9 C9 C9 сделать 9999.

Начнём с конца — собрать. Как в десятичной системе из цифр 1, 5, 0, 8 сделать число 1508? Очевидно: 1×1000+5×100+0×10+8×1. Прикол в том, что абсолютно так же это делается в любой системе счисления, хоть в шестнадцатеричной, хоть в двоичной, хоть в скольки-угодно-ичной. То есть имея A16, 316, 616, C16 для получения A36C нам нужно сделать то же самое: A×100016+3×10016+6×1016+С×116. Это видно во втором и третьем способах. Шутка в тему: существует 10 типов людей — те, кто не знает про двоичную систему счисления; те, кто про неё знает и те, кто не ожидал, что это шутка про троичную систему.

В первом способе вместо умножения используется сдвиг влево. Опять же как в десятичной системе если вам надо из 56 получить 5600, то вы сдвигаете на два разряда влево. А если сдвинуть на два разряда влево в двоичной системе, то получится умножение не на 100, а на 4 (на 2, а потом ещё на 2). Помня, как красиво шестнадцатеричная ложится на двоичную, мы видим, что сдвиг на четыре разряда в двоичной даёт нам сдвиг на один разряд в шестнадцатеричной, а это и есть умножение на 1016. SHL это двоичный сдвиг влево, то есть умножение на 2 в N-й степени.

Теперь о том, как убрать левые четыре разряда, которые мешают нам просто всё помножить и сложить. Если вы переведёте десятичное 15 в двоичной вид, то получится 1111, ну или 00001111, т.к. в байте 8 бит. Если теперь взять поразрядное «И» между 11001001 и 00001111, то выйдет 00001001. От C9 остаётся 09 — что нам и нужно. Дальше мы спокойно умножаем и складываем — получается второй способ. В первом кроме сдвига вместо умножения по сравнению со вторым способом ещё приходится делать байты шире через BYTE_TO_WORD — чтобы было куда сдвигать. При умножении такой проблемы не возникает, т.к. компилятор берёт размерность большего из операндов, но не меньше INT, если вы явно не указали иного.

Наконец в третьем способе мы не обнуляем лишние разряды заранее, а просто вычитаем то, что из них получается после суммирования и умножения. Деление C9 на 1016 даёт нам просто "C" — можете считать эту операцию обратным сдвигом (собственно, есть SHR — сдвиг вправо, можно было использовать его). Дальше мы пользуемся тем фактом, что во всех четырёх байтах лишняя тетрада одинаковая, а значит достаточно умножить любую из лишних тетрад на 1111016, чтобы получить излишек. Скажем C×1111016=CCCC0. Попробуем: С9 + С90 + С900 + С9000 = D6659. D6659 - CCCC0 = 9999. Ура.

Вроде ответил на все вопросы кроме одного, который не совсем правильно поставлен:
Потом умножается на 16#100 - эти операции выполняются в десятичной системе?
К операциям неприменимо понятие системы счисления. Причём не только в кодесисе или в программировании, а вообще в принципе. Система счисления это всего лишь способ записи самих чисел-операндов. Есть ещё всем известная римская нотация, и арифметика там даёт те же результаты. Никто не мешает сложить, например, IV + 9. Вместо otvet[3] * 16#1000 я бы мог написать otvet[2#11] * 4096, и результат был бы тот же.