#include <stdio.h>
#define N 20
void convertToHex(int [],int []);
void printTotal(int []);
int main(void)
{
//int num_10[] = {9,9,7,8,0,1,2,0};//N==8
int num_10[] = {1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,5};//N==20
int num_16[N] = {0};
convertToHex(num_10,num_16);
printTotal(num_16);
return 0;
}
void convertToHex(int num_10[],int num_16[])
{
int index = N-1;
int t = 0;
for(int i = 0; i < N-1; i++)
{
t = 0;
for(int j = i; j < N; )
{
while(t < 16 && j < N)
{
t = t * 10 + num_10[j];
num_10[j] = 0;
j++;
}
num_10[j-1] = t>>4;//num_10[j-1] = t/16;
t = t % 16;
}
num_16[index--] = t;
}
if(num_10[N-1] != 0) num_16[index--] = num_10[N-1]; //eta proverka nuzna esli naprimer kogda N == 2
}
void printTotal(int num_16[])
{
for(int index = 0 ; index < N; index++)
printf("%X",num_16[index]);
putchar('\n');
}
Сложный вопрос
public static byte[] operator *(byte[] op1, byte[] op2)
{
ushort k, t;
byte[] result = new byte[op1.Length + op2.Length];
for (int j = 0; j < op2.Length; j++)
{
k = 0;
for (int i = 0; i < op1.Length; i++)
{
t = (ushort)(op1 * op2[j] + result[i + j] + k);
result[i + j] = (byte)t;
k = (ushort)( t >> 8 );
}
result[j+op1.Length] = (byte)k;
}
return result;
}
Алгоритм для перемножения любой длины чисел использует два типа - byte и ushort. Сами числа представлены в виде массива байтов. Проблема заключается в том, как перевести десятеричное любой длины в двоичное или шестнадцатеричное? В двоичном числе каждые 8 знаков - это 1 байт, в шестнадцатеричном - каждые 2 знака это 1 байт, а вот в десятеричной нет (например, число 255 это один байт а 325 нет, хотя число знаков одинаковоое). Варианты типа взятие логарифма по основанию 2 или целочисленное деление не канают, так как десятерчиное число может быть настолько большим, что выходит за диапазон родных типов данных компьютера. Помогите, плз, уже неделю голову ломаю!!!
Цитата:
Originally posted by 3A3-968M
Проблема заключается в том, как перевести десятеричное любой длины в двоичное или шестнадцатеричное?
Проблема заключается в том, как перевести десятеричное любой длины в двоичное или шестнадцатеричное?
Если предположить что есть длинное число сохраненное в массиве(если я правильно поняла), например: 99780120д сохраненное как {9,9,7,8,0,1,2,0} , и его нужно перевести в СС16 тогда может:
/*С*/
Код:
При N == 1 будет вылетать баг
хотя думаю я тебя не поняла, но попытка говорят не пытка.
35 25 185 157
т.е. в виде 4 байт. При твоём варианте памяти бы надо было 9 байт - разница, как говорится, на лицо.
Решение я наконец нашёл: я просто делю десятеричное число по 4 символа. 4 символа в десятеричном представлении "влезут" в 2 байта, так как 9999<65535. Затем перевожу эти 4 знака в тип ushort. Малдшие 8 бит размещаю в младшем байте, а оставшееся, которое получу сдвигом вправо на 8 разрядов, размещаю во втором байте. Затем берём следующие 4 знака, получаю снова 2 байта, младший из которого складываю со старшим из предыдущей операции и т.д. до конца числа.
Цитата:
Originally posted by 3A3-968M
Нет, на самом деле не совсем так. Это простое решение располагать один десятеричный знак в одном байте, но это не эффективно не по используемой памяти не по логике, как минимум 6 битов в байте при таком раскладе по просту пустуют. Например, число 588888477 в виде массива байтов будет выглядеть так (2319B99D):
35 25 185 157
т.е. в виде 4 байт. При твоём варианте памяти бы надо было 9 байт - разница, как говорится, на лицо.
Решение я наконец нашёл: я просто делю десятеричное число по 4 символа. 4 символа в десятеричном представлении "влезут" в 2 байта, так как 9999<65535. Затем перевожу эти 4 знака в тип ushort. Малдшие 8 бит размещаю в младшем байте, а оставшееся, которое получу сдвигом вправо на 8 разрядов, размещаю во втором байте. Затем берём следующие 4 знака, получаю снова 2 байта, младший из которого складываю со старшим из предыдущей операции и т.д. до конца числа.
Нет, на самом деле не совсем так. Это простое решение располагать один десятеричный знак в одном байте, но это не эффективно не по используемой памяти не по логике, как минимум 6 битов в байте при таком раскладе по просту пустуют. Например, число 588888477 в виде массива байтов будет выглядеть так (2319B99D):
35 25 185 157
т.е. в виде 4 байт. При твоём варианте памяти бы надо было 9 байт - разница, как говорится, на лицо.
Решение я наконец нашёл: я просто делю десятеричное число по 4 символа. 4 символа в десятеричном представлении "влезут" в 2 байта, так как 9999<65535. Затем перевожу эти 4 знака в тип ushort. Малдшие 8 бит размещаю в младшем байте, а оставшееся, которое получу сдвигом вправо на 8 разрядов, размещаю во втором байте. Затем берём следующие 4 знака, получаю снова 2 байта, младший из которого складываю со старшим из предыдущей операции и т.д. до конца числа.
Ну и зачем придумывать велосипед? Давным давно система двоичо-десятичных упакованых чисел решена. Возьмите любой учебник по асму, там эта проблема описывается в первых главах.
Велик я не изобретал. Во-первых моим способом используется только две простейших операции - сложение и сдвиг вправо. Во-вторых двоично-десятичная система не пойдёт, нужен код 8-4-2-1, т.е. классическая двоичная система, т.к. код 2-10 не решает задачу оптмиальности и к тому же арфиметика системы 2-10 редко поддерживается аппаратно.
Конечно всё написано грамотно, не спорю. Но есть одно замечание... 2-10 код аппаратно поддерживается с i8086 проца, т.е. так называемая IBM 1... а так усё крута!!!
Цитата:
Originally posted by alektrik
Конечно всё написано грамотно, не спорю. Но есть одно замечание... 2-10 код аппаратно поддерживается с i8086 проца, т.е. так называемая IBM 1... а так усё крута!!!
Конечно всё написано грамотно, не спорю. Но есть одно замечание... 2-10 код аппаратно поддерживается с i8086 проца, т.е. так называемая IBM 1... а так усё крута!!!
alektrik
ты это о чем? если не секрет
ты хоть прочел все что здесь пишется, или как?
3A3-968M
может тему закрыть? а то я смотрю вопрос и вправду сложный, народ никак успокоиться не может.
Я не знаю, чё все парятся. Я уже давно всё сделал, так что вопрос благополучно закрываем.