Конвертация чисел из любой системы исчисления в любую другую.

благодарю за варианты. не серчай…))

Или память уж подводит, или же была какая-то (математическая?) хитрость арифметических действий между числами с разными основаниями БЕЗ приведения к общему основанию? Учитывая, что всё сводится фактически к позиционным многочленам, можно ли упростить допустим через дельту - разность оснований?

Например, 123(5) + 678(9) = ??? (12); БЕЗ перевода каждого значения к промежуточному десятичному

Есть там что-то в модулярной арифметике, но обычно проще привести все к основанию ответа (либо к основанию большинства значений в левой части) и делать все там.

1 лайк

Суть вопроса в том, чтоб выделить порцию исчисления в исходном числе. Вам все равно сложение придется делать в какой то одной системе исчисления. А, под каждую систему счисления писать арифметическую библиотеку это встреча с бесконечностью…)) По этому нужна промежуточная система, можно к примеру 256-и ричную систему использовать, ячейки памяти как раз ее хранят(по 8 бит). Или одна ричную когда будут квантовые компьютеры…))) со скоростью … бесконечность…))) Хотя наверняка где то в бесконечности затаилась универсальная формула, а может кому то уже известна.

Например, как указано в примере выше:

123(5) + 678(9) = ??? (12)

ответ нужен в 12-ричной системе, хотя по умолчанию (без скобок) можно считать десятеричную. Однако желательно исключить конверсию каждого числа через десятичное.

В принципе, если оптимизировать, оформить как класс для арифметических действий и действительных (вещественных, real), получится довольно интересно

По-моему, тут интерес чисто академический. Практической пользы я от этого не вижу. Может, подскажете?

Как и написал ваше – мне интересно, а практика покажет)

офф

@Алекс, а вы точно уверенны, что не видите практической пользы в цифрах? Вопрос, конечно, полуриторический, а суть в том, что, как и многое внешнее, основания/система исчисления - это всего лишь трактовка, условность. Например, почему разные алфавиты и раличное количество? зачем учить другие языки (включая ЯП)? почему вавилоняне считали в 60-ричной, что до сих пор отражается в секундах и минутах? почему 12 часов? откуда высокосный год, если считаю по семь дней в неделе? как так, что компьютер различает два состояния (бинарная), а выводят и считают именно в десятичной? почему именно так и кто это решил? зачем троичная/OCT/HEX? да и вообще зачем что-то знать и учиться?

Дело даже не столько в “матрицах”, шаблонах, межпредметных связях и кругозоре, а что когда человек видит суть, а не форму, он лучше понимает природу вещей, включая зависимости–и может играть (SEND+MORE=MONEY или тот же LEWIS СARROLL)и творить, фактически предсказывая будущее. Я считаю*, что для реального прогресса нам катастрофически не хватает именно таких людей с _не_заскриптованным инженерным мышлением

Похоже, мы несколько о разном. Я вовсе не имел в виду, что не вижу пользы в переходе от одной системы счисления к другой. Речь шла об осуществлении операций над числами, представленными в системах счисления с разным основанием без перевода их к некоторому единому основанию. Как часто нам нужны подобные операции, чтобы мучить себя идеей получить какой-то выигрыш от подобных операций? Т.е. был вопрос о практической пользе. Т.е. чтобы не уподобляться пресловутому коту, который известно чем занимается, когда заняться больше нечем )))

А меня ещё кое что интересует. Где граница того что считается переводом в другую систему счисления, а что нет? И реально ли вообще что то сделать с числами, не переходя эту границу?

Допустим можно разложить каждое число на цифры в его родной системе счисления. Хорошо, значит складываем последние цифры. 3(5) + 8(9). Но стоп, если считать их через integer - мы переводим всё в двоичную систему счисления! А что делать, считать как на пальцах? 3,8 => 4,7 => … => B(12), 0?

Лучше уже делать как в школе учили, сделать что то типо словаря, который будет хранить готовые результаты сложения цифр и доставать из него результат. Но опять же - результат надо как то хранить, а из за того что компьютеры у нас всех двоичные - это опять будет переведение в общую систему счисления.

ячейки памяти хранят 8 бит, следовательно разумно было бы использовать 256-ти ричную систему счисления или 16-ти. Но мы привыкли к 10-ти ричной. Все что меньше 256-ти ричной системы счисления, без конвертации, занимает больше памяти, и по идее все что больше 256-ти ричной системы должно занимать меньше памяти, но увы все ячейка это придел, потому как символ системы счисления также требует ресурсы для хранения. По этому системы исчисления нужны только для понимания и каких нибудь трюков в будущем, мало ли у кого нибудь родится какая нибудь фантазия в вычислениях…))

Интересно, каким Вы себе мните переключательный элемент, имеющий 256 надежных фиксированных состояний?

Верно, однако минимальная основа - бинарная (+2), хотя для байта порог остаётся:

основа:byte;
значение:longint; //int64 или чуть сложнее с BigInteger;

, но суть в том, что фактически отличие только в основе (трактовке). То есть, расчёты можно производить как обычно - в десятичной, а вот вывод – как указано в основании.

Другое дело - потенциально не эффективное использование памяти для хранения алфавита в том же [не дай боже] полустандартизированном UTF-32/UCS-4 (по 4 байта на символ), обработка ошибок, да и польза такой кодификации. В общем, как и я говорил, без возможности нормально* работать с такими значениями смысла не особо, зато если получится - пусть будет, есть не просит)

P.S. до сих пор на олимпиадах/собеседованиях почему-то популярны относительно редкие задания на bit-wise, перевод между системами счисления и смешанные основания