Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Извиняюсь, я далек от С++ но во мне затаился вопрос)) чем отличается ваше решение от банального умножения *?
«С каких пор оперировать битами стало медленнее, чем байтами?»— минимально адресуемая единица памяти в x86 — байт. Соотв. для адресации битов нужно использовать дополнительные манипуляции — это раз. Два — тут действует принцип брать максимальное за раз. Например нужно умножить два 64х разрядных числа. Процессор ето может сделать это одной командой, если начать умножать побайтно или побитно, то понадобится соотв. 8 команд умножение или 64. И это только кол-во операций умножения, а еще масса других для «соединения» результата воедино. Если не верите — проведите небольшой эксперимент — напишите парочку маленьких программ на Ассемблере.
«Это дает лишний расход памяти в 4 раза.»— откуда Вы взяли число 4? В этом случае гораздо больше. 4 будет если взять за основание системы счисления 2^16, а размер базового типа 2^64. И то это расход только на само хранение. Еще куча места выделяется во время подсчета. Кстати, такую организацию памяти придумал не я, если для Вас ето будет аргументом. Так принято хранить длинные числа.
«Вы храните массив цифр в порядке разрядов десятичного числа.»
«Вы путаете основание системы счисления с разрядностью двоичного числа»— Да нет. Обратите внимание на
#define BASE 10 //система счисления. Например, число 16400 можно представить в виде a[] = {0,0,4,6,1}, если основание системы 10. А если основание, допустим, 12000, то число примет вид a[] = {4400, 1}
Поясните. Почему это разумно?— Пояснения в статье в разделе «Реализация на C++»;
«Только к Вашей организации вычислений жтот метод не имеет никакого отношения.»— почему же?
Длинные числа удобно представлять в виде массивов.
Квадрат максимального числа в выбранной системе счисления должен помещаться в выбранный базовый тип. Это необходимо для хранения произведения одного разряда на другой в промежуточных вычислениях.
Выбранный базовый тип желательно брать знаковый. Это позволить избавиться от нескольких промежуточных нормализаций.
Лучше, чтобы в разряд помещалось сумма из нескольких квадратов максимального числа. Это позволит избавиться от нескольких промежуточных нормализаций.
Легкая и наглядная форма. Близка к действительному представлению числа в памяти. Автоматически резервирует место для операций умножения и сложения на возможность переполнения разряда.
Адресная арифметика просто не работает с типом void*
адресной арифметикой и приведениями типов.
системы счисления 2^32, а таких систем я не встречал даже в теории.
А какая разница какая система счисления?
Разница в скорости вычислений и объеме памяти
Умножение длинных чисел методом Карацубы