Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Перевод из 10-ой в 16-ную систему исчисления


Автор: deadlegolas 9.2.2009, 16:09
Добрый день,столкнулся с задачей перевода из 10ой системы счисления в 16ичную.. не знаю как реализовать.. Помогите,буду благодарен!

Автор: Rodman 9.2.2009, 21:44
http://forum.ixbt.com/topic.cgi?id=40:670

выбирай

Автор: deadlegolas 10.2.2009, 20:51
Цитата(Rodman @ 9.2.2009,  21:44)
http://forum.ixbt.com/topic.cgi?id=40:670

выбирай

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

Автор: deadlegolas 11.2.2009, 21:44
никто не знает?(

Автор: anatox91 14.2.2009, 00:15
насколько я знаю отдельно переводится целая часть, и отдельно дробная, так что дерзай

Автор: ИванМ 19.2.2009, 21:22
Я например даже не знаю как дробное число должно выглядеть в 16 СС. Ни один язык программирования и ни одна команда не работает с такими числами. Если просто нужно к виду X.X то действительно можно отдельно перевести целую часть, отдельно дробную, переведя ее в целую, и потом их склеить в виде строки.

Автор: deadlegolas 20.2.2009, 00:15
а кто-то может подсказать сам алгоритм перевода дробной части в 16 ? именно кодом.. а то я не совсем понимаю как это сделать

Автор: ИванМ 20.2.2009, 00:40
Исходное число val
На выходе строка res

 
Код

   double val=123.456;
    char str[]="0";
    char left[256]="0";
    char right[256]="0";
    char res[256];

    sprintf(str, "%f", val);

    for(int i=0;i<strlen(str);i++)
    {
        if(str[i]=='.')
        {
            strcpy(right, str+i+1);
            str[i]=0;
            strcpy(left, str);
        }
    }

    for(int i=strlen(right)-1;i>=0;i--)
    {
        if(right[i]=='0')
            right[i]=0;
        else
            break;
    }

    int rv=atoi(right);
    int lv=atoi(left);
    sprintf(res, "%X.%X", lv, rv);


Правда это не правильно потому что точка ставится с учетом 10й СС. Я че-нить подумаю над этим напишу.

Автор: ИванМ 20.2.2009, 01:24
Посмотри ссылку: http://gurulev.telebit.ru/sistschislenia.htm. Тут все написано

Автор: deadlegolas 20.2.2009, 01:44
Цитата(ИванМ @  20.2.2009,  00:40 Найти цитируемый пост)
Исходное число val
На выходе строка res

Ого,крутой код,пока что самое лучшее , что я видел по этому вопросу) зачет.)
но у меня почему-то не выводит результат,хотя вотчем все переменные имеют свои значения.. странно.. тупо ничего не выводит..
Цитата

Я че-нить подумаю над этим напишу.

буду очень благодарен!

Автор: mrbrooks 20.2.2009, 08:43
Можно представить вещественное число в виде массива символов. Этот массив привести к 16-ной системе не сложно.

Автор: deadlegolas 20.2.2009, 11:32
Цитата(mrbrooks @  20.2.2009,  08:43 Найти цитируемый пост)
Можно представить вещественное число в виде массива символов. Этот массив привести к 16-ной системе не сложно. 

это как?О_о
а какая разница в переводе числа и набора чисел?

Автор: deadlegolas 20.2.2009, 11:49
вроде бы работает такое преобразование в 16
Код

void dvoi(int x, int a[50])
{
int i=-1,j;
do{
i++;
a[i]=x%16;
x=x>>4;
if(x<16)
    {a[i+1]=x;
    i++;}
}
while(x>15);
for (j=i;j>=0;j--)
    {
    if(a[j]==10)
        cout<<"A";
    else
    if(a[j]==11)
        cout<<"B";
    else
    if(a[j]==12)
        cout<<"C";
    else
    if(a[j]==13)
        cout<<"D";
    else
    if(a[j]==14)
        cout<<"E";
    else
    if(a[j]==15)
        cout<<"F";
    else

    cout<<a[j];}
}



это перевод целого числа,а как перевести дробное число? множить на 16 и сдвигать биты влево? а то я побитовых операциях не очень)

Автор: mrbrooks 20.2.2009, 11:59
Цитата(deadlegolas @  20.2.2009,  11:32 Найти цитируемый пост)
а какая разница в переводе числа и набора чисел? 

поясни  smile 
Цитата(deadlegolas @  20.2.2009,  11:49 Найти цитируемый пост)
вроде бы работает такое преобразование в 16

мало того что велосипед изобретаешь, да еще к тому же и корявый  smile 
Цитата(deadlegolas @  20.2.2009,  11:49 Найти цитируемый пост)
это перевод целого числа,а как перевести дробное число? 

я вижу выход только через массив символов (для решения проблемы почитай про union). иначе потеряешь значения после запятой . 

Автор: deadlegolas 20.2.2009, 12:03

Цитата(mrbrooks @  20.2.2009,  11:59 Найти цитируемый пост)
мало того что велосипед изобретаешь, да еще к тому же и корявый  smile 

а почему корявый?)
Цитата

(для решения проблемы почитай про union)

сейчас почитаю..сенкс..
а ты не знаешь,как тот "корявый велосипед" заставить работать с алгоритмом перевода дробной части в 16ную?) 

Автор: mrbrooks 20.2.2009, 13:09
Цитата(deadlegolas @  20.2.2009,  12:03 Найти цитируемый пост)
а ты не знаешь,как тот "корявый велосипед" заставить работать с алгоритмом перевода дробной части в 16ную?)  

я даже боюсь на него смотреть  smile 

Автор: deadlegolas 20.2.2009, 15:10
вот блин)

Автор: ИванМ 20.2.2009, 17:04
Вот, рабочий пример. Переводит вещесвенное число из 10й в 16ю систему счисления.

Код

#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

char hex[16]="0123456789ABCDEF";
//---------------------------------------------------------------------------
//val - число в 10й СС, str-результат в 16й СС, num- требуемое число символов после запятой
void toHex(double val, char* str, int num=6)
{
    int n=(int)val;
    double right=val-n;
    sprintf(str, "%X", n);
    n=strlen(str);
    str[n]='.';
    str[n+1]=0;
    for(int i=0;i<num;i++)
    {
        right*=16.0;
        str[i+n+1]=hex[(int)right];
        str[i+n+2]=0;
        right-=(int)right;
    }

}
//---------------------------------------------------------------------------
void main()
{
    char str[256];
    toHex(75.96, str);
    printf("%s\n",str);
    system("pause");
}

Автор: deadlegolas 21.2.2009, 16:50
Благодарю)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)