fk0, легенда (06.09.2018 11:23, просмотров: 530) ответил SciFi на Какое-то вуду. Ты бы хоть ссылку на оригинал привёл для приличия.
Не знаю чем тебе поможет оригинал. Идея проста. Идём по битам исходного числа справа-налево, если бит установлен: к результату прибавляем единицу в BCD, затем в конце цикла результат умножаем на два в BCD тоже. Полученное BCD в десятичный вид https://codereview.stackexchange.com/questions/202403/printing-64-bit-decimal-numbers-in-freestanding-environment
тривиально переводится, поразрядно справа-налево, пока не останутся одни нули. Какие альтернативы? Классика подразумевает деление на 10 в цикле, пока не останется ноль, и выпечатывание остатков. Делить не умеем. Про замену деления на 10 на умножение на 0xCCCCCCCD (110011001100....11001101) я в курсе (оно из Hackers Delight идёт, 1100... это 8/10 в бинарном виде), но для деления 64-битного числа нужно умножать 64x64, иначе ничего не выйдет, а CPU умеет только 32x32 = 64. Можно, конечно, вручную расписать (и может даже, выйдет быстрее...) Какие ещё варианты?
Собственно вариант из Hackers Delight, когда ручками умножаем на 8 и на 0xCCCCCCCD, собственно говоря я не осилил, походу дела там двоичное к десятичному не сходится из-за слишком короткого ряда (1*2^-1 + 1*2^-2 + 0*2^-3 + 0*2^-4 + 1*2^-5... те же 11001100...), честно говоря не осилил я масштабировать алгоритм данный для 32-битных чисел для 64-х бит -- неправильно делит, догадываюсь надо более 64-разрядов арифметику и всё сойдётся, но не понимаю почему.
Вариант описывающийся на сахара 100500 раз уже: вычитаем сотни тысяч, потом десятки, потом единицы... Ну так для 20-разрядных (десятичные разряды) 64-битных чисел это получается огромная таблица уже (правда боюсь, мой код с BCD стремится к тому же размеру, после разворачивания всех макросов). Ещё жутко неудобно, что на C нет флагов переноса и инструкции BCD-коррекции. На Z80 асме такое написать в три раза проще чем на C.
[ZX]