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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
#1

Системы счисления - C++

11.12.2009, 20:51. Просмотров 1826. Ответов 25
Метки нет (Все метки)

Умные люди помогите пожалуста написать програму на С++ для превода целого двуичного числа в шестнадчетиричное. Желательно посредством "простих" функций. Заранее спасибо!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2009, 20:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Системы счисления (C++):

Простейший алгоритм перевода числа из 10 системы счисления в 16 ричную систему счисления - C++
Помогите написать самый простой алгоритм перевода из 10 системы счисления в 16 ричную систему счисления! Мне нужен именно самый простенький...

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

Программа обучения переводу чисел из десятичной системы счисления в 2 10 и 16 систем счисления - C++
дали задание составить программу нужно чтобы на экран выводилось это: Программа обучение переводу чисел из десятичной систем...

Перевод строки из 2-ной системы счисления в 8-ную систему счисления - C++
помогите пожалуйста как сделать перевод строки из 2 системы счисления на 8 систему счисления через массив ?

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

Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно - C++
Нужно две программы, одна реализует перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки, а другая...

25
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
11.12.2009, 23:45 #2
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
#include <iostream>
#include <string>
 
using namespace std;
 
const char ch[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 
int R10(string s) // перевод строки в 10-ое число
{
    int base = 1,
        res = 0;
    while (s.size())    {
        res += base * ((int) s[s.size()-1] - '0');
        s.resize(s.size()-1);
        base <<= 1;
    }
    return res;
}
 
string R16(int n) // перевод числа в 16 представление
{
    string s;
    while (n)   {
        s.insert(s.begin(),ch[n%16]);
        n /= 16;
    }
    return s;
}
 
int main()
{
    string number;
    cin >> number;
    int n = R10(number);
    cout << (R16(n)) << endl;
    system("pause");
    return 0;
}
1
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 00:17  [ТС] #3
Спасибо! Если можно немного вкратсе обяснить, просто есть кое што что мы еще не изучали((((
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 00:25 #4
что именно? строки?
base <<= 1 - то битовый сдвиг влево на 1 разряд, тоесть дописываем 0 в конец числа и если вы поэксперементируете, то увидите, что это умножение на 2, base >>= 1 - деление на 2.
вроде больше ничего такого, что можно не знать нет..
0
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 01:02 #5
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
#include <iostream.h>
#include <conio.h>
 
// Value - число, которое нужно перевести,
// Digits - количество выводимых символов
 
char *ToHex(unsigned Value,unsigned Digits)
{
  char *Hex = new char[Digits];
  Hex[Digits]='\0';
  int r;
  while (Value>=16 && Digits!=0)
          {
           r=Value%16;
           if (r>=10) Hex[--Digits]= r+55;
           else Hex[--Digits]= r+48;
           Value/=16;
          }
 
  if (Digits >0)
  {
         if (Value>=10) Hex[--Digits]= Value+55;
         else Hex[--Digits]= Value+48;
 
         for (int i = Digits-1; i >= 0; i--)  Hex[i]=48;
  }
  return Hex;
}
 
int main()
{
        int number;
        cin>>number;
        cout<<ToHex(number,8);
        getch();
        return 0;
}
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 01:14 #6
а давайте посоревнуемся, у кого выйдет меньше кода? (в разумных пределах)
0
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 01:31 #7
В смысле??? Если так уж хочется, тогда надо оговорить конкретное условие программы...
0
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 03:17  [ТС] #8
Спасибо вам большое! Вы сделали мне курсач! Спасибо за обяснения, думаю розберусь!

Добавлено через 13 минут
теряюсь в участке
C++
1
2
3
                while (s.size())        {
                res += base * ((int) s[s.size()-1] - '0');
                s.resize(s.size()-1);
первого кода, и
C++
1
2
3
4
char *Hex = new char[Digits];
  Hex[Digits]='\0';
  int r;
  while (Value>=16 && Digits!=0)
второго, буду презнателен если обясните или подскажете какую книгу скачать чтобы самому розобратся
0
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
12.12.2009, 06:24 #9
Adramelah, в первом случае почитай про контейнер std::string , а во втором динамически выделяется память под строку , например в строке типа char x[15] ; 14 значимых символов и последний резервирется под нулевой символ , отсюда Hex[Digits]='\0';
0
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 13:07 #10
И еще как вариант: из строки двоичной в строку шестнадцатиричную, как это сделал outoftime, только по своему
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
#include <iostream.h>
#include <conio.h>
 
char *BinToHex(char *Bin, int Length)
{
  int HexLen = (Length-1)/4, Sum=0;
  if ((Length-1)%4) HexLen++;
  char *Hex = new char[HexLen+1];
  Hex[HexLen--]='\0';
 
  for (int i=0,k=1; i < Length-1; i++, k<<=1)
  {
   if (i && !(i%4))
   {
    if (Sum>=10) Hex[HexLen--]=Sum+55;
    else Hex[HexLen--]=Sum+48;
    Sum=0;
    k=1;
   }
   if (Bin[Length-2-i]=='1') Sum+=k;
  }
 
  if (Sum>=10) Hex[HexLen]=Sum+55;
  else Hex[HexLen]=Sum+48;
  return Hex;
}
 
int main()
{
    char s[100];
    int n=0;
    cin>>s;
    do {n++;} while (s[n-1]!='\0');
    cout<<BinToHex(s,n);
    getch();
    return 0;
}
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 15:46 #11
Цитата Сообщение от manfeese Посмотреть сообщение
В смысле??? Если так уж хочется, тогда надо оговорить конкретное условие программы...
допустим что у нас на входе строка, которая представляет число -(1<<31)..(1<<31 - 1) в двоичной системе счисления, вывести 16-ичное представление.. блоки #include, #define, #typedef, namespace а также все функции должні иметь по отступу сверху и снизу.
Пример:
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
using namespace std;//использовать пространство имен обязательно если используются cout, cin
 
int main() {
  cout << "Sample" << endl;
  return 0;
}


C++
1
2
3
while (s.size())        {
res += base * ((int) s[s.size()-1] - '0');
s.resize(s.size()-1);
base - это множитель, каждое число в n-ой системе счисления можно представить как x0 + x1*base+x2*base^2+...+xn*base^k-1; что-бы не возносить каждый раз в степень base, мы ее умножаем на саму n, где n - система счисления, k - количество чисел числа. s[s.size()-1] - возвращает последний символ строки, можно еще так писать: *(--s.end()) но для этого надо знать что представляют собой итераторы.. так как мы получили символ, и преобразовываем его в число, значит мы получит код символа, но нам надо число, которое представляет этот символ а не его код, поэтому мы отнимаем код нуля s[s.size()-1] - '0'. s.resize(s.size()-1); - отсекает последний символ строки, while (s.size()) работает до тех пор пока размер строки не станет нуль.
0
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 15:56 #12
outoftime, Я немного не понял! Это ты мне объяснил так подробно??? или это что-то вроде условий???
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 16:13 #13
все что после примера не тебе
0
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 16:26 #14
так я уже выложил свой вариант для ввода строки, содержащей двоичное представление числа, и выводящей его шестнадцатиричное представление, ранее...

А если уж ставить условия, то хотелось бы предложить не использовать встроенные функции (кроме ввода-вывода), а писать исключительно свои, тогда и будет видно насколько коды отличаються друг от друга по размеру и эффективности!!!
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 17:26 #15
хотя, минуса можно откинуть.. считаем только мантисы

Добавлено через 1 минуту
без СТЛ-я? эффективность это одно, а мало кода - это другое))

Добавлено через 35 минут
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
#include <iostream>
#include <string>
#include <algorithm>
 
using namespace std;
 
int main()  {
    string s, sn;
    int res = 0, base = 8, k = 4;
    char a[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    cin >> s;
    do  {
        res += (*(--s.end()) - '0') ? ( ((base << 1) == 16) ? (base = 1) : (base <<= 1) ) : ((((base << 1) == 16) ? (base = 1) : (base <<= 1)) ? (0) : (0));
        if (!(--k)) {
            sn.push_back( a[res] );
            k = 4;
            res = 0;
        }
        s.resize(s.size() - 1);
    } while (s.size());
    if (res) sn.push_back(a[res]);
    reverse(sn.begin(),sn.end());
    cout << sn << endl;
    return 0;
}
Это все на что у меня хватает фантазии..
0
12.12.2009, 17:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2009, 17:26
Привет! Вот еще темы с ответами:

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

С восьмеричной системы счисления в десятичную систему счисления - C++
Задание: Дана строка символов. Если он изображен целого числа в восьмеричной системе счисления, то перевести его в целое число в...

Перевод чисел из 16 системы счисления в 2 систему счисления - C++
Помогите составить программу для перевод чисел из 16 с/c в 2 c/c при условии,что программ может переводить и дробные числа.

системы счисления - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;math.h&quot; using namespace std; int main(void) {char a; int...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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