Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/120: Рейтинг темы: голосов - 120, средняя оценка - 4.74
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1

Перевод числа из десятичной системы счисления в шестнадцатеричную

01.09.2014, 14:39. Показов 24231. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выскажите вашу точку зрения по этому коду

Задача:
Напишите функцию, которая будет переводить числа из десятичной системы счисления в шестнадцатеричную.

Мой код на C++Builder 6 (не ругать):
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
//---------------------------------------------------------------------------
 
string DecHex(int);
 
int main(int argc, char* argv[])
{
    int i = 1000;
    int a;
    cin >> a;
    cout<<DecHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
 
string DecHex(int ch)
{
     using namespace std;
     string s, b;
     int c, d;
     do
        if ((ch != 0) && (fmod(ch,16) != 0))
        {
            c = ch/16; //?????
            d = ch%16; //???????
            switch(d)
            {
               case 0:  b = "0"; break;
               case 1:  b = "1"; break;
               case 2:  b = "2"; break;
               case 3:  b = "3"; break;
               case 4:  b = "4"; break;
               case 5:  b = "5"; break;
               case 6:  b = "6"; break;
               case 7:  b = "7"; break;
               case 8:  b = "8"; break;
               case 9:  b = "9"; break;
               case 10: b = "A"; break;
               case 11: b = "B"; break;
               case 12: b = "C"; break;
               case 13: b = "D"; break;
               case 14: b = "E"; break;
               case 15: b = "F"; break;
            }
            ch = c;
            s = b+s;
        }
        else
        {
          return(s);
        }
     while (true);
}
Вроде всё работает, но стали возникать вопросы:

Правильно ли он написан? Как можно его улучшить? Хорошо ли придумано с "case"?
Выскажите вашу точку зрения по этому коду.

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2014, 14:39
Ответы с готовыми решениями:

Перевод из десятичной системы счисления в шестнадцатеричную
Здраствуйте дорогое сообщество КиберФорума, на просторах вашего форума нашёл не один вариант перевода из 10 в 16 вид, но не нашёл пояснения...

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

Перевод числа из десятичной в шестнадцатеричную систему счисления
Здраавствуйте, помогите найти ошибку в этом коде. Непонимаю почему при переводе таких чисел как 16,32,64,128 и тд не дописываются нули. ...

40
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
01.09.2014, 19:39
Студворк — интернет-сервис помощи студентам
AndHacker, неплохо бы использовать unsigned int как аргумент, чтобы не было ошибок. (либо добавить обработку отрицательных чисел)
Ну и повторюсь, если система не десятичная, по хорошему надо добавить
C++
1
return("0x" + s);
Добавлено через 1 минуту

Не по теме:

AndHacker, а вы перфекционист какой-то :D

1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
01.09.2014, 20:06
Цитата Сообщение от AndHacker Посмотреть сообщение
Отличная мысль и не надо объявлять массив. Внедрю в код.
Можно не использовать массив.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    while ( ch != 0 ) 
    {
        //d = ch%16; // s = m[ch % 16] + s; 
        // ch/=16;
        //s = m[d]+s; 
        
        unsigned char d = (unsigned int)ch % 16;
 
        if( d < 10 ) 
            s = (char)( d + '0' ) + s;
        else 
            s = (char)(  d - 10u + 'A' ) + s;
 
        ch/=16;
    }
Добавлено через 8 минут
Или так:
C++
1
2
3
4
5
6
7
    while ( ch != 0 ) 
    {
        unsigned char d = (unsigned int)ch % 16;
        ch/=16;
 
        s = (char)( d<10 ? ( d + '0' ) : (  d - 10u + 'A' )  ) + s;
    }
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
01.09.2014, 22:58
Раз такое дело, тоже выложу свой вариант, как бы я реализовал эту функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    unsigned int ch = 0x12345AF; // исходное число
    unsigned char rez[11], *prez = rez+10, d;
    *prez-- = 0;
    do {
        d = ch & 0x0F;
        *prez-- = (char)( d < 10 ? (d + '0') : (d - 10u + 'A') );
        ch >>= 4;
    } while (ch);
    *prez-- = 'x'; *prez = '0';
    // уже готов наш указатель на начало строки результата, строка завершается нулем
    // выведем строку в текст окна
    wchar_t buf[11];
    wsprintfW(buf, L"%hS", prez);
    SetWindowTextW(hwndSta3, buf);
Добавлено через 5 минут

Не по теме:

Цитата Сообщение от КОП Посмотреть сообщение
AndHacker, а вы перфекционист какой-то
Имхо все правильно ТС делает - только так можно чему-то научиться. Кое-как он и сам написал, и мог бы на этом остановиться, а тут ему столько дельных советов дали, что он и новое узнал, и применять это будет в будущем. Хотел бы я, чтобы мне так активно и конструктивно помогали в моих вопросах :)

1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.09.2014, 07:32
C++
1
2
3
4
5
6
7
8
9
string DecHex( int ch )
{
    string s;
    do {
        s = "0123456789ABCDEF"[ch & 15] + s;
        ch >>= 4;
    } while ( ch );
    return s;
}
Проверить негде. Должно работать.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
02.09.2014, 08:28
Цитата Сообщение от AndHacker Посмотреть сообщение
Это - Builder, без этой библиотеке в консоли никак.
Эта библиотека не имеет к консоли вообще никакого отношения. Совсем вообще никакого отношения. Первая буква в ее названии сокращение от слова Visual. Вторая от слова Component. Вы видели в консоли визуальные компоненты?
Мой вариант еще раз посмотрите. И воткните туда castaway-евскую функцию.
Цитата Сообщение от castaway Посмотреть сообщение
Проверить негде. Должно работать.
Проверил. Работает.
2
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
02.09.2014, 15:15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define _DEBUG 
 
string DecHex( int ch )
{
    string s;
    do {
        s = "0123456789ABCDEF"[ch & 15] + s;
#ifdef _DEBUG 
        cout << s << endl;
        if( s.length() > 20 ) break;
#endif 
        ch >>= 4;
    } while ( ch );
    return s;
} 
 
int main()
{
    DecHex( -1 );
    system("pause");
    return 0;
}
Миниатюры
Перевод числа из десятичной системы счисления в шестнадцатеричную  
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
02.09.2014, 18:41  [ТС]
А в Билдере строки не с 1 индексируются, разве? Этот код работает правильно?
Если написать вот так:
C++
1
2
3
4
       
string s;
s = "0123456789ABCDEF"[1];
cout<<s;
Программа выведет "1", т.е строки в билдере индексируются с нуля.
А вот в Borland Delphi, нумерация начинается с одного.

Добавлено через 1 час 10 минут
Цитата Сообщение от КОП Посмотреть сообщение
AndHacker, неплохо бы использовать unsigned int как аргумент, чтобы не было ошибок. (либо добавить обработку отрицательных чисел)
Ну и повторюсь, если система не десятичная, по хорошему надо добавить
C++
1
return("0x" + s);
Добавлено через 1 минуту

Не по теме:

AndHacker, а вы перфекционист какой-то :D

неплохо бы использовать unsigned int
в смысле смысле сделать это как-то так:
C++
1
string DecHex(unsigned int ch)
с этим согласен, Спасибо.

return("0x" + s);
А какое отношение имеет эта строка? Если приписать в конец функции return("0x"+s); программа будет выводить текст: "0x"+строка.

Ну и повторюсь, если система не десятичная
к тому же система как раз десятичная

Добавлено через 2 минуты
Цитата Сообщение от Alex5 Посмотреть сообщение
Можно не использовать массив.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    while ( ch != 0 ) 
    {
        //d = ch%16; // s = m[ch % 16] + s; 
        // ch/=16;
        //s = m[d]+s; 
        
        unsigned char d = (unsigned int)ch % 16;
 
        if( d < 10 ) 
            s = (char)( d + '0' ) + s;
        else 
            s = (char)(  d - 10u + 'A' ) + s;
 
        ch/=16;
    }
Добавлено через 8 минут
Или так:
C++
1
2
3
4
5
6
7
    while ( ch != 0 ) 
    {
        unsigned char d = (unsigned int)ch % 16;
        ch/=16;
 
        s = (char)( d<10 ? ( d + '0' ) : (  d - 10u + 'A' )  ) + s;
    }
Спасибо, этот тот самый отличный вариант с символами, который переложил _Ivana.
Применение, сокращенной конструкции if делает этот код длинной в 4 строчки.
Только до такого-вот d - 10u + 'A' я бы не догадался. Кстати что означает 10u ???
d - 10u + 'A'
Добавлено через 2 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
Раз такое дело, тоже выложу свой вариант, как бы я реализовал эту функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    unsigned int ch = 0x12345AF; // исходное число
    unsigned char rez[11], *prez = rez+10, d;
    *prez-- = 0;
    do {
        d = ch & 0x0F;
        *prez-- = (char)( d < 10 ? (d + '0') : (d - 10u + 'A') );
        ch >>= 4;
    } while (ch);
    *prez-- = 'x'; *prez = '0';
    // уже готов наш указатель на начало строки результата, строка завершается нулем
    // выведем строку в текст окна
    wchar_t buf[11];
    wsprintfW(buf, L"%hS", prez);
    SetWindowTextW(hwndSta3, buf);
Добавлено через 5 минут

Не по теме:

Имхо все правильно ТС делает - только так можно чему-то научиться. Кое-как он и сам написал, и мог бы на этом остановиться, а тут ему столько дельных советов дали, что он и новое узнал, и применять это будет в будущем. Хотел бы я, чтобы мне так активно и конструктивно помогали в моих вопросах :)

Спасибо, в скором времени буду детально изучать Ваш код.

Тут такое дело... В общем, решил заниматься последовательно по книжке Максима Динмана:
2 глава - Основы программирования
3 глава - Функции.
А вот главы про обработку массивов и указателей находятся чуть дальше. Поэтому Я даже не пытался реализовать это указателями.
Мне непонятно что даёт эта строка:
unsigned int ch = 0x12345AF; // исходное число
Это число оно же вроде не десятичное?

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
string DecHex( int ch )
{
    string s;
    do {
        s = "0123456789ABCDEF"[ch & 15] + s;
        ch >>= 4;
    } while ( ch );
    return s;
}
Проверить негде. Должно работать.
Да это работает и уже успешно добавлено. Мой код вверху неактуален,т.к взят с самого начала обсуждения(1 страница).

Добавлено через 5 минут
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Эта библиотека не имеет к консоли вообще никакого отношения. Совсем вообще никакого отношения. Первая буква в ее названии сокращение от слова Visual. Вторая от слова Component. Вы видели в консоли визуальные компоненты?
Мой вариант еще раз посмотрите. И воткните туда castaway-евскую функцию.
Проверил. Работает.
Мой вариант еще раз посмотрите. И воткните туда castaway-евскую функцию.
Вот скриншот, который наглядно демонстрирует, что будет если убрать строчку
C++
1
#include <vcl.h>
и вставить castaway-евскую функцию. Итог: 2 ошибки Linked Error
Вот скриншот: [cut]

Добавлено через 5 минут
Цитата Сообщение от Alex5 Посмотреть сообщение
Можно не использовать массив.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    while ( ch != 0 ) 
    {
        //d = ch%16; // s = m[ch % 16] + s; 
        // ch/=16;
        //s = m[d]+s; 
        
        unsigned char d = (unsigned int)ch % 16;
 
        if( d < 10 ) 
            s = (char)( d + '0' ) + s;
        else 
            s = (char)(  d - 10u + 'A' ) + s;
 
        ch/=16;
    }
Добавлено через 8 минут
Или так:
C++
1
2
3
4
5
6
7
    while ( ch != 0 ) 
    {
        unsigned char d = (unsigned int)ch % 16;
        ch/=16;
 
        s = (char)( d<10 ? ( d + '0' ) : (  d - 10u + 'A' )  ) + s;
    }
system("pause");
Это что-то новое для меня, я до этого подключал библиотеку
#include <conio.h> и писал getch(); Ура! Минус одна библиотека. Спасибо, что просветили.
И это... Что делает эта программа?
Зачем использовать #define, если можно обойтись простым ифом?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.09.2014, 18:45
Мухлёж на тему перевода из десятичной в шестнадцатеричную:
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
std::string IntToHex(int x)
{
 std::string r;
 uint8_t *p;
 bool f;
 uint8_t *e;
 char Digits[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}
 if (x<0)
 {
  r="-";
  x=-x;
 }
 else
 {
  r="";
 }
 for (p=(uint8_t*)x, e=p+sizeof(x)-1, f=false; p<=e; ++p)
 {
  c=Digits[(*p)/16];
  if ((c!='0')||f)
  {
   f=true;
   r=r+c;
  }
  if (p==e)
  {
   f=true;
  }
  c=Digits[(*p)%16];
  if ((c!='0')||f)
  {
   f=true;
   r=r+c;
  }
 }
 return r;
}
.
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.09.2014, 18:50
Цитата Сообщение от AndHacker Посмотреть сообщение
А какое отношение имеет эта строка?
Я к тому, что если программа выводит число 10, то как правило, это значит "десять", но в шестнадцатеричной системе это уже "шестнадцать". Непорядок!
Поэтому я предлагаю добавить обозначение основания системы счисления. "0х" - всего лишь наиболее употребляемое обозначение для hex.
Конечно, если вывод программы типа:
dec hex
5 5
10 A
16 10
То в этом нет необходимости. Решать, конечно, вам

Добавлено через 3 минуты
Цитата Сообщение от AndHacker Посмотреть сообщение
Мне непонятно что даёт эта строка:
unsigned int ch = 0x12345AF; // исходное число
если вы задаете шестнадцатеричное число, пишите 0х123
если восьмеричное: 0123
1
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.09.2014, 18:50
А теперь честный способ:
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
std::string IntToHex(int x)
{
 std::string r;
 unit8_t c;
 char Digits[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}
 if (x<0)
 {
  r="-";
  x=-x;
 }
 else
 {
  r="";
 }
 for (f=false; x!=0; x/=16)
 {
  c=x%16;
  if ((c!='0')||f)
  {
   f=true;
   r=r+Digits[c];
  }
 }
 return r;
}
.
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
02.09.2014, 19:02  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
А теперь честный способ:
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
std::string IntToHex(int x)
{
 std::string r;
 unit8_t c;
 char Digits[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}
 if (x<0)
 {
  r="-";
  x=-x;
 }
 else
 {
  r="";
 }
 for (f=false; x!=0; x/=16)
 {
  c=x%16;
  if ((c!='0')||f)
  {
   f=true;
   r=r+Digits[c];
  }
 }
 return r;
}
.
Если исправить Ваши опечатки получится следующий код:
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
 
std::string IntToHex(int x)
{
 std::string r;
 unsigned char c;
 bool f;
 char Digits[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 if (x<0)
 {
  r="-";
  x=-x;
 }
 else
 {
  r="";
 }
 for ( f ==false; x!=0; x/=16)
 {
  c=x%16;
  if ((c!='0')||f)
  {
   f=true;
   r=r+Digits[c];
  }
 }
 return r;
}
 
int main(int argc, char* argv[])
{
    int a;
    cin >> a;
    cout<<IntToHex(a);
    getch();
    return 0;
}
//---------------------------------------------------------------------------
В вашем коде я заменил тип переменной с uint8_t на unsigned char, так как Borland матерился. Полагаю это было правильное решение?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.09.2014, 19:26
Блин, забыл ещё один глюк убрать.
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
std::string IntToHex(int x)
{
 std::string r;
 unit8_t c;
 char Digits[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}
 if (x<0)
 {
  r="-";
  x=-x;
 }
 else
 {
  r="";
 }
 for (f=false; x!=0; x/=16)
 {
  c=x%16;
  if (x<16)
  {
   f=true;
  }
  if ((c!='0')||f)
  {
   f=true;
   r=r+Digits[c];
  }
 }
 return r;
}
Добавлено через 1 минуту
Цитата Сообщение от AndHacker Посмотреть сообщение
В вашем коде я заменил тип переменной с uint8_t на unsigned char, так как Borland матерился. Полагаю это было правильное решение?
Логичней unsigned int. Но хуже. В студии можно unsigned small int.
1
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
02.09.2014, 19:39  [ТС]
Если объявить переменную таким образом:
C++
1
unsigned small int a;
Выдаётся синтаксическая ошибка, это Билдер

Вынужден Вас расстроить:
При переводе получаются следующие результаты:
936 -> 8A3 - верно
-936 -> -8A3 - НЕ ВЕРНО, должно получиться FFFFFFFFFFFFFC58
Проверьте в калькуляторе Windows
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.09.2014, 19:42
Цитата Сообщение от AndHacker Посмотреть сообщение
Если объявить переменную таким образом:
Код C++
1
unsigned small int a;
Выдаётся синтаксическая ошибка, это Билдер
Билдер - не студия. В билдере замена на unsigned char вполне адекватна и лучшее, чем unsigned short int, или unsigned int.
0
16 / 16 / 10
Регистрация: 11.09.2013
Сообщений: 157
Записей в блоге: 1
02.09.2014, 19:48  [ТС]
Таким образом с виду небольшая задача, превратилась в более большую:

На десерт осталась война с отрицательными числами, а также... с числами после запятой.
Эти две задачи Я постараюсь решить сам завтра.

Всем большое Cпасибо за помощь и идеи! Я узнал много нового и интересного...
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.09.2014, 19:55
Отрицательные я сделал.

Добавлено через 6 минут
А со знаками после запятой есть проблема точности результата преобразования, так как не все конечные десятичные дроби точно переводятся в конечные двоичные, четвертичные, восьмеричные, или шестнадцатеричные. Например, 0.3 - это сколько? 0,4CCCCCCCCCCCCCCCCD, или 0,4CCCCCCD?
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
02.09.2014, 20:00
А можно ещё и так(с отрицательными работает):
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
#include <stdio.h>
#include <conio.h>
char *dec2hex(int jx)
{
static char bf[9];
_asm{
 
        mov ecx, 8      // кол-во цифр
        mov edx, jx 
        lea edi, bf
//      int 3
lll:
        shld    eax,edx,4
        shl edx,4 
// немного магии - пребразование 00h - 0Fh в символ '0' - 'F' без переходов
        and al, 0Fh     // только младший ниббл
        add Al, 90h     // в AL от 90h до 09Fh.
        daa         // теперь в AL 90h - 99h(флаг CY сброшен) или 00h - 06h (CY взведён).
        adc Al, 40h     // в AL 0D0h - 0D9h или 41h - 46h.
        daa         // Oops! В AL теперь "0"-"9" или "A"-"F" :)
        stosb
        loop    lll
        sub al,al
        stosb
}
return bf;
}
void main(void)
{ int jx;
while(1){
puts("\n\rEnter N:");
scanf("%d",&jx);
cputs(dec2hex(jx));
};
};
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
02.09.2014, 20:12
Цитата Сообщение от AndHacker Посмотреть сообщение
-936 -> -8A3 - НЕ ВЕРНО, должно получиться FFFFFFFFFFFFFC58
почему именно так? почитайте про хранение отрицательных чисел в памяти, все станет понятно. FFFFFFFFFFFFFC58 - это способ представления отрицательных чисел такой, само число в hex: -8A3
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
02.09.2014, 21:38
Цитата Сообщение от AndHacker Посмотреть сообщение
Таким образом с виду небольшая задача, превратилась в более большую
Вот и замечательно. Разберитесь в моем коде, хотя он совершенно неплюсовый, я плюсов не знаю , зато азы строк и указателей в С пощупаете. А на закуску с кодом Charles Kludge разберитесь, если суффикс вашего ника имеет для вас какой-то смысл.

Добавлено через 6 минут
ЗЫ
Цитата Сообщение от AndHacker Посмотреть сообщение
Мне непонятно что даёт эта строка:
unsigned int ch = 0x12345AF; // исходное число
Это число оно же вроде не десятичное?
В компьютере нет десятичных чисел, там только двоичные вообще чисел нет, только биты. Почитайте про двоичное представление чисел и подумайте, какие биты будут в байте, если написать
C++
1
a = 255; b = 0xFF; c = b11111111;
и чем отличаются эти записи. Хотя к моему удивлению в Вижуал Студии нет двоичных констант и последняя запись вызовет ошибку, не знаю как будет в Билдере. А АВР студии например двоичные константы есть, с ними очень удобно.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.09.2014, 09:38
Цитата Сообщение от _Ivana Посмотреть сообщение
компьютере нет десятичных чисел, там только двоичные вообще чисел нет, только биты.
А ничего, что биты есть двоичные цифры, причём по одном не адресуются? Разработчикам компьютеров явно Платно покоя не даёт, поэтому в компьютерах всё есть число, даже логические величины подлежат числовому кодированию.

Добавлено через 3 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
Хотя к моему удивлению в Вижуал Студии нет двоичных констант и последняя запись вызовет ошибку, не знаю как будет в Билдере.
b11111111 начинается с латинской буквы, что делает её идентификатором, а не литералом. В принципе некоторые компиляторы понимают
C++
1
x=0b11111111;
, но вроде как стандартом это не определено. Иначе будет не понятно, например, что такое b11 в третьей строке
C++
1
2
3
int b11;
int a;
a+=b11;
. Это 11 двоичное (то есть три), или переменная b11?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.09.2014, 09:38

Перевод числа из восьмеричной системы счисления в шестнадцатеричную систему счисления
Вот пример числа: 754 = 1EC 1000 = 200

Перевод натурального числа из десятичной системы счисления в систему счисления по основанию
Здравствуйте. Я хотела бы попросить у вас помощи. Я понимаю, что это не очень красиво, но вдруг кто-нибудь откликнется. Я не очень...

Рекурсия: перевод целого числа из десятичной системы счисления в 9 систему счисления
Написать рекурсивную функцию перевода целого числа из десятичной системы счисления в 9-чную систему счисления.

Перевод числа из десятичной системы счисления
Помогите пожалуйста решить поставленную задачу с помощью функции пользователя и рекурсивной:Для заданного целого десятичного числа N...

Перевод числа из десятичной системы счисления
Напишите рекурсивную программу перевода числа из десятичной системы счисления в n (n&lt;10).


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru