Перевод HEX -> DEC
(з.ы. в [квадратных скобках] буду писать основание системы)
Предположим есть число 10[16] надо перевести ее в ??[10].
Способ перевода всем извесен со школы:
10[16] = 1*16 + 0*1 = 16[10]
и так далее для любого числа...почти любого, пока мы можем вычислить x*16^n. Как только n переваливает за 8ой разряд у нас происходит переполнение long'а (__int64 тоже не особо поможет).
Сложность моей задачи как раз и состоит в том, что числа для перевода слишком большие(512 бит), чтобы можно было их сосчитать таким способом.
(наример:
52648f924d25b8b978f945c6324897456287a43264ee189266732[16]->??[10])
У меня есть только одна идея способа реализации перевода такого числа - самого примитивного и медленного: сделать что-то вроде десятиричного счетчика с бесконечным числом разрядов, хранящегося в строке. Декриментировать HEX до нуля, инкрементируя счетчик. Тупо, зато работает.
Есть у кого какие-нть идеи?
P.S. Даже для декремента числа 2*10^9[10] на моей машине уходит около 10 секунд. Это конечно не точная оценка, но тем не менее, впечатляет.
2. Существуют известные большинству людей еще со школы алгоритмы сложения, вычитания, умноржения и деления многоразрядных чисел в столбик. Именно ими и следует пользоваться. При этом во "внутремем представлении" число может быть не только строкой, но и массивом обычных чисел, например, 4-байтовых.
2. Существуют известные большинству людей еще со школы алгоритмы сложения, вычитания, умноржения и деления многоразрядных чисел в столбик. Именно ими и следует пользоваться. При этом во "внутремем представлении" число может быть не только строкой, но и массивом обычных чисел, например, 4-байтовых.
Как производить операции я имею представление. Каким образом это относится к переводу?
Во-первых, я не собирался производить перевод именно тем способом, что я описал. Просто сказал, что мне ничего не приходит в голову умнее вот такой убогой схемы перевода.
з.ы. а декерементацию (если уж мы настолько отчаянно не можем найти другого средства) можно модифицировать применением алгоритма наподобии бинарного поиска. Не фонтан, кончено, но все же :)
10[16] = 1*16 + 0*1 = 16[10]
и так далее для любого числа...почти любого, пока мы можем вычислить x*16^n. Как только n переваливает за 8ой разряд у нас происходит переполнение long'а (__int64 тоже не особо поможет).
Сложность моей задачи как раз и состоит в том, что числа для перевода слишком большие(512 бит), чтобы можно было их сосчитать таким способом.
(наример:
52648f924d25b8b978f945c6324897456287a43264ee189266732[16]->??[10])
У вас же задача специфическая - работа с 512-битными числами. Т.е. универсальности не требуется. Ну, вот и составтьте массив десятичных 16^n до нужного разряда и с ними работайте.
1. Для решения ЛЮБОЙ задачи ее сначала надо понять.
2. Для перевода многоразрядных чисел требуется умение производить с ними арифметические операции. Процессор умеет производить операци над числеми невысокой разрядности, а над длинными - нет. Поэтому нам для перевода чисел из одной системы в другую требуется реализовать алгоритмы арифметических операций над длиными числами.
2. Для перевода многоразрядных чисел требуется умение производить с ними арифметические операции. Процессор умеет производить операци над числеми невысокой разрядности, а над длинными - нет. Поэтому нам для перевода чисел из одной системы в другую требуется реализовать алгоритмы арифметических операций над длиными числами.
все готово давно(класс BigInt для работы с 512 битными числами). и работает нормально в 16 разрядной системе (сложение, умножение, деление, вычитание, сдвиг влево/вправо).
Это не проблема и не суть вопроса.
Вопрос в том как перевести число из HEX в DEC, если формула:
...12345 = ... + 1*65536 + 2*4096 + 3*256 + 4*16 + 5*1
непримениема из-за большого количества рарядов в HEX форме
Поэтому следует либо уточнить вопрос, либо, если это не по силам, попытаться объяснить, каким образом усматривается эта мнимая связь. В этом случае можно будет найти ошибку в рассуждениях и порекомендовать, что следует делать.