По сути, это то же самое, что превращать 23 в строку, изменив ее на 2 * 10 + 3, затем превратив 2 и 3 в символы.
Чтобы разбить его, сначала разделим на 16, так как мы работаем в шестнадцатеричном формате.
b >> 4 означает сдвиг битов на 4 пробела, поэтому
12345678 >> 4 = 00001234
тогда значение в позициях 1234 ищется в массиве hexDigit.
Затем мы выполняем операцию модуля, также известную как получение остатка. В десятичном примере это нахождение 3, отрубая все налево. Для двоичного кода они используют AND здесь.
0x0f в битах равно 00001111, поэтому, когда AND с байтом, он изменит 4 левых пробела на 0, оставив только правые 4.
12345678 & 0x0f = 00005678
и снова мы ищем значение в позициях 5678 в массиве hexDigit. Обратите внимание, что я использую 1-8 в качестве маркеров положения, фактические данные будут все 0 и 1.
Редактировать: Вторая функция в основном выполняет ту же операцию, она использует те же функции >>> и &, чтобы разбить символ Юникода на байты. По-видимому, предполагается, что символ Юникода равен 16 битам, поэтому он сдвигает его на 8 позиций, чтобы получить левые 8 бит, и использует & 0xff, чтобы получить правильные 8 бит.