Я пишу произвольную целочисленную библиотеку c ++ в качестве домашнего задания. Я представлял числа внутри как вектор беззнакового целого, в базе 10 ^ n, где n настолько велико, насколько это возможно, вписываясь в одну целую цифру без знака.
Я сделал этот выбор в качестве компромисса между пространством, производительностью и доступом к цифрам (он позволяет мне иметь гораздо лучшие характеристики, чем при использовании базы 10, без каких-либо сложностей при преобразовании в удобочитаемую строку).
Так, например:
base10 (441243123294967295) 18 цифр
base1000000000 (441243123,294967295) 2 цифры (через запятую)
Внутреннее представление с uint32
[00011010 01001100 11010101 11110011] [00010001 10010100 11010111 11111111]Чтобы завершить домашнее задание, я должен реализовать сдвиг битов и другие побитовые операторы.
Имеет ли смысл реализовывать сдвиг для числа с таким внутренним представлением?
Должен ли я перейти на основание 2 ^ n, чтобы все биты внутреннего представления имели значение?
Вы Можно, но ты не должен: сдвиг битов удвоит число, независимо от того, какую базу вы используете толкования это позже, потому что внутренне эти int
s по-прежнему интерпретируются как двоичные с помощью базовых операций сдвига. Ваша реализация должна будет принять решение о компромиссе, потому что ваш сдвиг станет труднее реализовать. С другой стороны, печать в Base-10 останется проще.
Другое решение в пользу десятичной системы, которое вы можете рассмотреть, заключается в использовании двоично-десятичные дроби (BCD). В свое время аппаратное обеспечение, используемое для ускорения этих операций (например, 6502, процессор Apple-2), включало специальные инструкции для добавления байтов в интерпретацию BCD. Вы должны будете выполнить специальную коррекцию, если используете это представление, но это может быть достойным упражнением в обучении.
Должен ли я перейти на основание 2 ^ n, чтобы все биты внутреннего представления имели значение?
Определенно да!
Мало того, но современные компьютеры в целом все о base2. Если это упражнение, вы, скорее всего, захотите научиться делать это хорошо.
Все библиотеки для этого вида используют базу 2. Они делают это по причине: более быстрая обработка, возможность для побитовых операций, более компактное хранение и многое другое. Эти преимущества перевешивают трудность преобразования в десятичную. Поэтому настоятельно рекомендуется преобразовать в двоичный файл.