На днях столкнулся с проблемой преобразования двоичного числа в десятичную строку (для вывода на экран). Казалось бы, в большинстве языков программирования есть функции преобразования этого рода, но не в этом случае:
- Само число представлено как массив беззнаковых 32-битных целочисленных (unit32[]).
- Длина числа может быть разная, от нескольких бит и до бесконечности (точнее, размера ОП). То есть преобразовывать его в int\double не вариант для более чем 32
Что есть:
- Числа представлены как экземпляры класса. Класс содержит поля отвечающие за фактическую длину числа в битах "len", количество 32-битных секторов "sectors", сами числа "d[]", и and-маску накладываемую на последний сектор для симуляции "неполного сектора".
- Базовые операции (+, -, and, or, xor, обычные и циклические сдвиги) применяемые к упомянутым выше классам и возможность вырывать\вставлять "куски" любого количества бит\смещения.
- Относительно оптимизированные операции сравнения таких чисел (==, !=, <, <=, >, >=).
- Существующие операции преобразования стандартных 32-битных целочисленных.
Мои идеи в этом отношении:
- Реализовать деление на 10 с вычислением остатка на существующих операциях для получения десятичных цифр, преобразовать их в строку.
Преимущества:- Скорее всего это будет работать.
Недостатки:- Необходимость реализации быстрого "битового" деления чисел.
- Вероятно драматически падающая производительность с увеличением длины числа.
Что хотелось бы услышать: какие-либо идеи (не обязательно с каким-либо кодом) того как это сделать более удачно\быстро.
Хорошего дня.
__________________
Мой сайт-блог. Игры, обновления, примеры для Haxe, JavaScript(+HTML5), GameMaker, Love2d...