powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно привести тип в функции конвертации системы исчисления
25 сообщений из 36, страница 1 из 2
Как правильно привести тип в функции конвертации системы исчисления
    #38560567
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;

int hexdec (char * hex) {
 int k=strlen(hex);
 int i;
 int res=0;
 for (i=2; i<k;i++) {
  if (hex[i]=='F') res+=15*pow(16,k-i-1);
  else if (hex[i]=='E') res+=14*pow(16,k-i-1);
  else if (hex[i]=='D') res+=13*pow(16,k-i-1);
  else if (hex[i]=='C') res+=12*pow(16,k-i-1);
  else if (hex[i]=='B') res+=11*pow(16,k-i-1);
  else if (hex[i]=='A') res+=10*pow(16,k-i-1);
  else res+=(int*)hex[i]*pow(16,k-i-1);
}
return res;}

int main()
{
 cout << hexdec("0xF1")<< endl;
 return 0;
}



else res+=(int*)hex[i]*pow(16,k-i-1);--что то эта строка не работает.
Или не так привожу типы или else надо как то иначе употребить.
С буквами в шестнадцятиричном виде работает на отлично-например-0хFFFF

Модератор: Используйте тег SRC для оформления исходника
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560568
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В (int*)hex[i]*pow(16,k-i-1);---(int*)--эта часть лишняя просто разные варианты испытывал
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560571
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int hexdec (char * hex) {
int k=strlen(hex);
int i;
int res=0;
for (i=2;i<k;i++) {if (hex[i]=='F') res+=15*pow(16,k-i-1);
else if (hex[i]=='E') res+=14*pow(16,k-i-1);
else if (hex[i]=='D') res+=13*pow(16,k-i-1);
else if (hex[i]=='C') res+=12*pow(16,k-i-1);
else if (hex[i]=='B') res+=11*pow(16,k-i-1);
else if (hex[i]=='A') res+=10*pow(16,k-i-1);
else if (hex[i]>=0 && hex[i]<=9) res+=hex[i]*pow(16,k-i-1);// не читает цыфры числа только буквы-то есть что то с приведением типов
}
return res;}

int main()
{
cout << hexdec("0x1F")<< endl;
return 0;
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560575
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int hexdec (char * hex)
{
    int k=strlen(hex);
    int res=0;
    int koeff=1;

    for(int i=k-1; i>1; i--)
    {
        if (hex[i]>'9') res+=(hex[i]-'A'+10)*koeff;
        else res+=(hex[i]-'0')*koeff;

        koeff*=16;
    }
    return res;
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560724
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Sla,

Слева направо намного проще, понятнее и быстрее :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int hexdec (char * hex)
{
    int res=0;
    for (; *hex; hex++)
    {
        res <<= 4;
        if (*hex > '9')
            res += *hex - 'A' + 10;
        else
            res += *hex - '0';
    }
    return res;
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560896
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там речь идет о элементах масива чар. Что достаточно будет hех[i]-'0'. Это не одиночный символ. Потом там коэф.=1 и 16. Там кроме того не одна буква А а А..F. Кроме того важена степень с
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560902
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

Стесняюсь спросить. Русский ваш не родной язык? Сложно понять о чем вы пытаетесь спросить. Может как-то на пальцах?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

Правильно.
Вот это может не сработать:
Код: plaintext
1.
return v;



Для надежности надо писать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
if (v == 1)
  return 1;
else if (v == 2)
  return 2;
else if (v == 3)
  return 3;
else if (v == 4)
  return 4;
else if (v == 5)
  return 5;
else if (v == 6)
  return 6;
else if (v == 7)
  return 7;
...  
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560930
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСлева направо намного проще, понятнее и быстрее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int hexdec (char * hex)
{
    int res=0;
    for (; *hex; hex++)
    {
        res <<= 4;
        if (*hex > '9')
            res += *hex - 'A' + 10;
        else
            res += *hex - '0';
    }
    return res;
}


Не возьмет 0x
stut
Код: plaintext
1.
cout << hexdec("0xF1")<< endl;



stut, предлагаю самому понять как работает алгоритм Anatoly Moskovsky
Немного подскажу:
1. Считается так 3B97 = (((3 * 16 + 11) * 16 + 9) *16 + 7
2. res <<= 4; это умножить на 16
3. сам допили чтоб 0x не обрабатывалось
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560933
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДля надежности надо писать так:


Нельзя так же забывать о флуктуациях в шине, поэтому не все операции присваивания проходят с первого раза. Для надежности добавляется простая проверка:

Код: plaintext
1.
2.
3.
do {
   x = a;
} while ( x != a);
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38560982
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе возьмет 0x
По большому счету должен быть еще один уровень вызова, который по префиксу определяет что вызвать: hexdec, octdec, decdec.... и выдавать ошибку если префикс неверный.
Иначе что слева что справа парсить строку - все равно будет всякий мусор неверно интерпретировать.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561106
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Все фигня,
Код: plaintext
1.
2.
3.
int hexdec (char * hex) {
  return strtol(hex,NULL,16);
}
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561135
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
stutelse if (hex[i]>=0 && hex[i]<=9) res+=hex[i]*pow(16,k-i-1);// не читает цыфры числа только буквы-то есть что то с
Ты чё, так нельзя... '0' на самом деле равен сорока восьми, а '9' - пятидесяти семи... :)
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561142
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
?Ты чё, так нельзя... '0' на самом деле равен сорока восьми, а '9' - пятидесяти семи... :)Причем самое смешное, что это вовсе не шутка...
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38561222
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Символ ноль '0' имеет шестнадцатиричный код 0x30 в кодировке ASCII или 48 в десятичной системе.
Этим можно пользоваться. Но для символов старше 0x7f это опасно т.к. мы уходим в национальные
кодировки которые могут на экране выглядеть одниаково но иметь разные коды (прим: 1251,koi-8,cp866).
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562408
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да проблема уже давно решилась. res+=hex[i]*pow..надо заменить на hex[i]-'0' и все работает. Что то даже очень просто.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562426
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее хекс-итэ надо заменить, а перед пов поставить 16. А я то думал почему там такие большие числа получаются а '2' считалось 50, например. Очень хорошая прога получилась. Может надо тему переименовать: как перевести число из 16 в 10-чную систему исчисления.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562516
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutМожет надо тему переименовать: как перевести число из 16 в 10-чную систему исчисления.
Лучше назвать "как не надо переводить" :)
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562832
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, в смысле, а что не работает? Или это принцип такой. Я бы здесь не публиковал и не старался сделать свою если бы в нете была готовая. И работающая.
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562865
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stutв смысле, а что не работает?
вызов pow() в конверторе счисления - это пример того как не надо делать.
Даже если "работает" :)
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562960
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut,

тебе же уже указали на strtok - она делает ровно то, что ты хотел. почему этот вариант не использовал?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38562993
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковstrtok
strtol
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563241
stut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strlok-не использовал эту команду никогда. И при чем она здесь. Я вот что хотел узнать что значит цикл. Первые два параметра: for (;*ptr;++ptr)-то есть пока есть указатель на строку. Ну а начальный параметр, где цикл начинается?
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563304
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut где цикл начинается?
где-то выше по коду
Код: plaintext
1.
ptr = ...


В примере передается в параметрах
Anatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
5.
int hexdec (char * hex)
{
    int res=0;
    for (; *hex; hex++)
...
...
Рейтинг: 0 / 0
Как правильно привести тип в функции конвертации системы исчисления
    #38563310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stut for (;*ptr;++ptr)-то есть пока есть указатель на строку.
т.е. пока *ptr != 0
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно привести тип в функции конвертации системы исчисления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]