Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Ferrari F1
599 / 492 / 99
Регистрация: 27.01.2015
Сообщений: 2,893
Записей в блоге: 1
Завершенные тесты: 1
#1

Перевод числа из hex в dec - C++

10.07.2016, 15:37. Просмотров 2595. Ответов 40
Метки нет (Все метки)

Привет, можете подсказать как можно перевести 16-ричное число произвольной длины (например, заданное с помощью строки) в десятичную сс? (также можно в строку)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2016, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод числа из hex в dec (C++):

Перевод чисел Bin - Oct - Dec - Hex - C++
Существуют ли функции для перевода числа (или строки из цифр) из одной системы счисления (по основанию 2, 8, 10, 16) в другую. Как из...

[BMP] HEX (из HEX-редактора) в DEC - C++
Имеется файл *.bmp (который нельзя вложить в сообщение). В самом файле есть его свойства (размер и т.д.). Как их перевести из HEX в DEC? ...

Из Hex в Dec - C++
Перевел из чара в инт и что-то не вьеду как теперь возвести . #include<iostream> #include<cmath> #include<string> using...

S dec na hex, ukazatel - C++
Pomogite pojaluista! Etot kod menyaet 10noe chislo na 16noe. Nado izmenit eto chtoby zdes byl ukazatel i funkcia to est v int main() Tolko...

Как в С++ конвертнуть HEX в DEC? - C++
Киберперцы, есть ли готовая функция в Visual C++ для конвертации из HEX (типа F4A36) в DEC (типа 1002038) ?

Манипуляторы dec hex setfill setw - C++
что такое операторы dec hex setfill sew м как они работают?

40
Ferrari F1
599 / 492 / 99
Регистрация: 27.01.2015
Сообщений: 2,893
Записей в блоге: 1
Завершенные тесты: 1
13.07.2016, 14:53  [ТС] #31
HenryDukart, у меня просто не получается формализовать этот процесс (процесс продумывания алгоритма) на все возникающие передо мной задачи.

По-вашему, есть какие-то общие правила составления алгоритма или это творческий процесс?
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
13.07.2016, 15:13 #32
Ferrari F1,

Не по теме:

Считаю, что изобретение алгоритма требует много знаний, творческого потенциала и, возможно, везения. А вот уже для самого "кодирования" достаточно обладать памятью и опытом.

0
Ferrari F1
599 / 492 / 99
Регистрация: 27.01.2015
Сообщений: 2,893
Записей в блоге: 1
Завершенные тесты: 1
13.07.2016, 16:42  [ТС] #33
Нуу, я немного не об этом, конечно... Я вот знаю как на бумажке делить в столбик.
А как научиться переводить этот навык на компьютерный язык?
Вот в подобных случаях и возникают, как правило, трудности...
0
zer0mail
2343 / 1973 / 193
Регистрация: 03.07.2012
Сообщений: 7,093
Записей в блоге: 1
13.07.2016, 16:49 #34
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Я не знаю как преобрести навык проектирования алгоритма решения задачи.
Надо хоть что-то делать самому. В теме 30+ сообщений, немало кода, но нет ни строчки, написанной ТС. Хочешь бегать - бегай, хочешь поднимать тяжести - поднимай. Можно, конечно, смотреть, как это делают другие, но толку будет мало (если он вообще будет).
Несколько раз в теме писалось: "нужна длинная арифметика". Ее в интернете навалом - и на строках и на массивах и на векторах, но ТС ничего ни искать ни делать самостоятельно (по аналогии со школьным умножением и сложением в столбик) не стал. С таким подходом С++ никогда не осилить
1
Ferrari F1
599 / 492 / 99
Регистрация: 27.01.2015
Сообщений: 2,893
Записей в блоге: 1
Завершенные тесты: 1
13.07.2016, 16:59  [ТС] #35
Цитата Сообщение от zer0mail Посмотреть сообщение
нет ни строчки, написанной ТС.
код у меня есть, но недоделанный. Просто иногда бывают моменты когда просто не соображаешь, что надо писать, чтобы было в верном направлении...
А вместо этого получается какая-то лажа в виде багов.
Пишешь например, а потом выясняется, что числа типа F00001 неверно обрабатываются из-за наличия промежуточных нулей.
Или например первая (или любая внутренняя) цифра в числе не делится нацело на десять (она меньше 10), тогда нужно запоминать эту цифру и к след. разряду ее приписывать (1F01).
Слишком много случаев получается, и в голове их все, бывает, не можешь удержать. Как следствие - баги...

C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
unsigned f_fromHex(const char& digit)
{
    switch (digit)
    {
    case 'A':
        return 10;
        break;
    case 'B':
        return 11;
        break;
    case 'C':
        return 12;
        break;
    case 'D':
        return 13;
        break;
    case 'E':
        return 14;
        break;
    case 'F':
        return 15;
        break;
    default:
        return digit - '0';
        break;
    }
}
 
unsigned f_convert(const string& str);
 
void f_strDevide(string& number, string& result)
{
    string forReturn;
    
    auto temp(0u);
    for (auto head(number.cbegin()), cur(head), end(number.cend() - 1);
        head != end; ++head)
    {
        temp = f_convert(string(cur, head + 1));
 
        if (temp / 10)
        {
            forReturn += to_string(temp / 10);
            cur = head;
            temp = 0;
        }
        else if (!forReturn.empty())
        {
            forReturn.push_back('0');
        }
    }
}
 
string f_toDec(string hex)
{
    string result;
 
    while (hex.size() > 1)
        f_strDevide(hex, result);
 
    auto digit(f_fromHex(*hex.begin()));
    result += to_string(digit % 10);
 
    if (digit /= 10)
        result += to_string(digit);
 
    reverse(hex.begin(), hex.end());
    return result;
}
 
int main()
{
    string number("1FFFF");
    system("pause");
}
0
zer0mail
2343 / 1973 / 193
Регистрация: 03.07.2012
Сообщений: 7,093
Записей в блоге: 1
13.07.2016, 17:05 #36
Если код есть, то его надо писать в первом сообщении, а не в 35м. Причем писать с комментариями, зачем, что и как делаешь. Вместе со словесным описанием алгоритма, который реализует этот код. Тогда будет видно, где и какие ошибки и времени (нашего и вашего) будет потрачено меньше, а толку будет больше.
Вот, как-то так
0
Ferrari F1
599 / 492 / 99
Регистрация: 27.01.2015
Сообщений: 2,893
Записей в блоге: 1
Завершенные тесты: 1
13.07.2016, 17:15  [ТС] #37
И я ума не приложу, как так в голове продумать алгоритм, чтобы он был обобщенным, а не охватывал лишь частные случаи..
Это я говорю не только о делении, а вообще обо всех возникающих задачах...

Добавлено через 3 минуты
Перед тем, как писать это деление, я никакой архитектуры программы не продумывал.
Просто сел и так навскидку попытался сделать... Без псевдокода, диаграмм и тп, как пишут об этом в книгах.
И как результат, тут некоторые накидали код за час-два, а я за третий день не могу нормально ничего набросать.

Да как вобще бороться с этой проблемой?
0
Croessmah
Эксперт CЭксперт С++
13419 / 7573 / 855
Регистрация: 27.09.2012
Сообщений: 18,645
Записей в блоге: 3
Завершенные тесты: 1
13.07.2016, 17:24 #38
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Да как вобще бороться с этой проблемой?
Практикой. Если сдаваться, то не справитесь
И отчаиваться не надо, если не получается
Всё равно рано или поздно одолеете.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.07.2016, 17:46 #39
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Да как вобще бороться с этой проблемой?
Мне кажется, в таких случаях надо несколько снизить сложность решаемых задач. Натренироваться и почувствовать себя уверенно на простых, а потом постепенно усложнять. Ну и потом рассматриваемая задача не столько на программирование, сколько математическая, про позиционные системы счисления не вредно было бы в процессе решения почитать.
1
zer0mail
2343 / 1973 / 193
Регистрация: 03.07.2012
Сообщений: 7,093
Записей в блоге: 1
14.07.2016, 15:10 #40
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
И я ума не приложу, как так в голове продумать алгоритм, чтобы он был обобщенным, а не охватывал лишь частные случаи.
Для начала надо придумать и реализовать алгоритм, который решает конкретную поставленную задачу: для этой надо час-два максимум. А не сидеть 3 дня в раздумьях "как бы решить задачу в общем". Если в процессе решения возникнет возможность обобщения, причем за счет небольших усилий, то пожалуйста. Иначе будет так: время потрачено, а результата нет.
От программиста нужен результат, а не медитации и объяснения типа "хотел обобщить, сделать лучше, эффективнее, но не получилось". Все обобщения и улучшения - после (если они окажутся действительно необходимыми). Что на самом деле лучше выясняется в процессе реализации, а не в процессе многодневного "нечегонеделания".
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
15.07.2016, 17:59 #41
Ferrari F1,
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
И я ума не приложу, как так в голове продумать алгоритм, чтобы он был обобщенным, а не охватывал лишь частные случаи..
Это я говорю не только о делении, а вообще обо всех возникающих задачах...
Ferrari F1, промышленное программирование предполагает поиск библиотек и сшивание их минимальным кодом.
Но когда интересно покодировать велосипед, приходится решать всё самому. Тогда имеет смысл начать с самых простых кирпичиков, из которых потом построится дом. Тут можно задать вопрос : "Без чего в дальнейшем не обойтись". Тогда появляются функции вроде:
C++
1
2
3
4
5
6
7
8
9
10
//полезная простая функция
//когда непонятно ещё куда бечь можно начать с таких вещей:
char decimal_from_hex_char(char hex)
{
char ret;
if(hex>'0'-1 && hex < '9'+1) ret = hex-'0';
if((hex>'A'-1 && hex < 'F'+1)) ret = 10 + hex - 'A';
if((hex>'a'-1 && hex < 'f'+1)) ret = 10 + hex - 'a';
return ret;
}
или
C++
1
2
3
4
5
6
7
8
9
10
11
12
//такой вектор нужен так как в строках числа более одного знака "растворяются" с потерей информации
void make_vec_from_hexStr(string &srcStr, vector<char> &vec)
{
vec.clear();
typedef string::size_type Str_t;
Str_t len = srcStr.size();
if(len>0)
for(Str_t i=0; i<len; ++i)
{
vec.push_back(decimal_from_hex_char(srcStr[i]));
}
}
Если задача объёмистая не стоит мелочиться в написании средств вывода промежуточных результатов. Функции show_vec - средство вывода основной структуры данных в реализации (векторов чар).
Когда появляется инструментарий решающий простые части задачи, её решение осмысливается в терминах данных инструментовабстракций и не кажется таким уж сложным. Но и далее принцип - от простого к сложному, это надёжный путь к победе. Это потому, что наш мозг имеет ограниченные ресурсы, но в отличие от компьютера умеет конструировать (собирать из одних структур другие более сложные структуры).
Результат в моём варианте очень громоздок и неэффективен, по сравнению с предложенными, но может оказаться легче для понимания, не только самого алгоритма (он не суть важен), сколько для визуализации процесса построения алгоритма.
C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
//полезная простая функция
//когда непонятно ещё куда бечь можно начать с таких вещей:
char decimal_from_hex_char(char hex)
{
char ret;
if(hex>'0'-1 && hex < '9'+1) ret = hex-'0';
if((hex>'A'-1 && hex < 'F'+1)) ret = 10 + hex - 'A';
if((hex>'a'-1 && hex < 'f'+1)) ret = 10 + hex - 'a';
return ret;
}
 
//такой вектор нужен так как в строках числа более одного знака "растворяются" с потерей информации
void make_vec_from_hexStr(string &srcStr, vector<char> &vec)
{
vec.clear();
typedef string::size_type Str_t;
Str_t len = srcStr.size();
if(len>0)
for(Str_t i=0; i<len; ++i)
{
vec.push_back(decimal_from_hex_char(srcStr[i]));
}
}
 
//разогнался но для char это не нужно ( в этом коде не используется )
template<typename T>
void show_vec(typename vector<T> &vec, string name="")
{
if(name!="")cout<<name<<endl;
if(vec.size()>0)
for(size_t i=0; i<vec.size(); ++i)cout<<vec[i]<<' ';
cout<<endl;
}
 
//это использовано при отладке ( в коде не тоже вызывается )
void show_vec(vector<char> &vec, string name="")
{
if(name!="")cout<<name<<endl;
if(vec.size()>0)
for(size_t i=0; i<vec.size(); ++i)cout<<(short)vec[i]<<' ';
cout<<endl;
}
 
//имея сложение можно ещё умножать и возводить в степень
//это не эффективно, но будет работать
//потом можно пересмотреть код и поработать над эффективностью
//реализовав уменожение не посредством сложения, а как-то быстрее
void long_add(vector<char> &first, vector<char> &second, vector<char> &retV)
{
retV.clear();
vector<char> retVec;
typedef vector<char>::size_type Vec_t ; 
Vec_t flen=first.size();
Vec_t slen=second.size();
 
Vec_t biglen=max(flen, slen);
Vec_t smallen=min(flen, slen);
 
 
vector<char> bigVec = first;
vector<char> smallVec = second;
 
if(biglen!=smallen)
{
bigVec = biglen==first.size()? first : second;
smallVec = smallen==first.size()? first : second;
}
 
if(!smallen)
{   
retVec=bigVec;
return;
}
 
int  overlap=0, current, numFromSmall, indInSmall = smallen-1, rate=10;
for(int i = (int)biglen-1; i>-1; --i)
{
 
if(indInSmall>-1) numFromSmall = smallVec[indInSmall--];
else numFromSmall = 0;
current=overlap+bigVec[i]+numFromSmall;
 
overlap=current/rate;
retVec.push_back(current%rate);
 
}
if(overlap>0)
{
current=overlap;
overlap=current/rate;
retVec.push_back(current%rate);
}
if(overlap>0)retVec.push_back(overlap);
 
Vec_t l_rev = retVec.size();
 
for(int i=(int)l_rev-1; i>-1; --i)
retV.push_back(retVec[i]);
}
 
//умножение использует сложение
void long_multiply(size_t n, vector<char> &src, vector<char> &retV) 
{
retV.clear();
if(n==0)
{
retV.push_back(0);
return;
}
if(n==1)
{
retV=src;
return;
}
 
vector<char> to_add=src;
for(size_t i=1; i<n; ++i)
{
long_add(src, to_add, retV);
to_add=retV;
}
}
 
//вначале src это вектор из одного символа представляющий число в 16-ричной строке 
//n - номер разряда (считая справа и начиная с нуля)
//фактически src умножается на 16 n раз 
//на каждом шаге растёт длина src а цифры разрядов не превышают 9 (то есть переполнения нет)
//это и есть длинная арифметика
//и получается результирующий вектор соответствующий числу в позиции исходного вектора
//эти число придётся сложить чтобы получить результат представляющий:
//An * 16^n + An-1 * 16^(n-1) + ... + A1 * 16 + A0
void long_vec_from_hex_position(size_t n, vector<char> &src, vector<char> &retV) 
{
retV.clear();
if(n==0)
{
retV=src;
return;
}
long_multiply(16, src, retV);//для изменения счисления можно ввести дополнительный арумент и заменить число 16
src=retV;
long_vec_from_hex_position(n-1, src, retV);
}
 
void long_vec_from_hex_position(vector<char>::size_type n, vector<char> &src) 
{
vector<char> retV;
if(n==0)
{
return;
}
 
for(vector<char>::size_type i=0; i<n; ++i)
{
long_multiply(16, src, retV);
src=retV;
}
}
 
//используя всё перечисленное выше конвертируем 16-ричную строку в 
//десятиричную
void convert_hex_string_to_decimal(string &hex_str, string &dec_str)
{
 
vector<char> vdec, vtemp, vrestmp, vres;
make_vec_from_hexStr(hex_str, vdec);
vrestmp.push_back(0);
typedef vector<char>::size_type Vec_t ; 
Vec_t vdlen=vdec.size();
 
for(Vec_t i=0; i<vdlen; ++i)
{
vtemp.clear();
 
vtemp.push_back(vdec[i]);
long_vec_from_hex_position(vdlen-i-1, vtemp); 
long_add(vtemp, vrestmp, vres);
vrestmp=vres;
}
 Vec_t vreslen=vres.size();
 dec_str.clear();
 for(int i=0; i<vreslen; ++i)dec_str+=vres[i]+'0';
}
 
int main(int argc, char* argv[])
{
 
string hexStr="ABCDEF1";
 
string dec_str;
convert_hex_string_to_decimal(hexStr, dec_str);
 
cout<<dec_str<<endl;
system("pause");
return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2016, 17:59
Привет! Вот еще темы с ответами:

Влияет ли манипуляторы hex,oct,dec на массив символов? - C++
Влияет ли манипуляторы hex,oct,dec на массив символов? есть unsigned char str; Ввожу и так cin &gt;&gt; hex &gt;&gt; str; и так cin &gt;&gt; str; ...

Как разбить одно число HEX число на два числа HEX ? - C++
Задача в том, что бы одно число в виде HEX (к примеру 0xD681) разбить на 2 числа HEX (из 0xD681 - &gt; 0xD6 и 0x81) именно что бы вот так...

Перевод данных в hex. - C++
Всем привет! char buffs = {&quot;\x01\x7f\x34\xb0\x80&quot;}; printf(&quot;%02X \n&quot;,buffs); // выводит 01 printf(&quot;%02X \n&quot;,buffs); // выводит 7F ...

Перевод string в hex - C++
Как перевести букву в шестнадцатеричный вид. Например: Г - это 0xC3; Получилось следующее: QString str = &quot;ПРИВЕТ&quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
41
Yandex
Объявления
15.07.2016, 17:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru