Предполагается, что s
- это буфер длиной 5 (включая нулевой терминатор), и записывает шестнадцатеричное представление i
.Результатом является шестнадцатеричное представление i
по модулю 65536 (для многих старых систем unsigned int
имеет диапазон от 0
до 65535
).
s += 4;
*s = '\0';
Это завершаетсяs
и помещает туда нулевой терминатор.
for (n = 4; n != 0; --n) {
Теперь мы вернемся назад к строке результата и заполним соответствующий char
.
"0123456789ABCDEF"[i & 0x0F];
Это выбирает правильный char
.i & 0x0F
получает наименее значимое шестнадцатеричное значение, и, используя его в качестве нижнего индекса для доступа к массиву на "0123456789ABCDEF"
, получается соответствующий символ.
*--s = ...
Полученный символ помещается в правильное местои указатель снова уменьшается, поэтому следующая позиция может быть заполнена в следующем цикле цикла.
i >>= 4;
Теперь мы сместим число на четыре бита, удалив четыре бита, которые мы только что преобразовали в шестнадцатеричное число,Теперь следующие четыре бита будут младшими значащими шестнадцатеричными цифрами.
Пример
Давайте возьмем число 58008
.В шестнадцатеричном виде это 0xE298
.Мод 16 это 8
, поэтому "0123456789ABCDEF"[8];
получает "8"
.
Затем мы сдвигаем его на четыре бита, в результате чего 3625
.Мод 16 это 9
, и мы получаем "9"
.После следующей смены мы получаем 226
, мод 16 - 2
, а через одну смену - 14
."0123456789ABCDEF"[14]
is "E"
.
Соберите эти результаты в обратном порядке, и вы получите E298
.