16+
Пятница
16 ноября
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
fk0  (06.09.2018 11:23, ссылка) , в ответ на Какое-то вуду. Ты бы хоть ссылку на оригинал привёл для приличия. автор: SciFi
Не знаю чем тебе поможет оригинал. Идея проста. Идём по битам исходного числа справа-налево, если бит установлен: к результату прибавляем единицу в BCD, затем в конце цикла результат умножаем на два в BCD тоже. Полученное BCD в десятичный вид 
тривиально переводится, поразрядно справа-налево, пока не останутся одни нули. Какие альтернативы? Классика подразумевает деление на 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]
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7527 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII