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

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

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

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

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

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

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

Системы счисления - C++
Ребят помогите срочно выполнить задание. Я просто в данной теме не понимаю. Лабораторная работа №1 Тема: Системы счисления. Перевод...

Системы счисления - C++
Реализовать модуль, обеспечивающий преобразование десятичных чисел в двоичные и наоборот. Двоичные числа хранить в виде массива целых...

Системы счисления - C++
Не могу понять задание (задание в картинке). Объясните, пожалуйста, как это должно выглядеть в рабочем виде. Вот то, что сделала. ...

из 16 в 10 (системы счисления) - C++
Как на C++ перевести шестнадцетиричное число в десятичное?? Обе переменные int типа!!!!

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

системы счисления - C++
Помогите, пожалуйста. Необходимо написать программу, которая переводит числа из 16ой СС в 2ую и 8ую Числа: 9F40 ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
508 / 430 / 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;
}
Adramelah
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 13
12.12.2009, 00:17  [ТС]     Системы счисления #3
Спасибо! Если можно немного вкратсе обяснить, просто есть кое што что мы еще не изучали((((
outoftime
║XLR8║
508 / 430 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 00:25     Системы счисления #4
что именно? строки?
base <<= 1 - то битовый сдвиг влево на 1 разряд, тоесть дописываем 0 в конец числа и если вы поэксперементируете, то увидите, что это умножение на 2, base >>= 1 - деление на 2.
вроде больше ничего такого, что можно не знать нет..
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;
}
outoftime
║XLR8║
508 / 430 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 01:14     Системы счисления #6
а давайте посоревнуемся, у кого выйдет меньше кода? (в разумных пределах)
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 01:31     Системы счисления #7
В смысле??? Если так уж хочется, тогда надо оговорить конкретное условие программы...
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)
второго, буду презнателен если обясните или подскажете какую книгу скачать чтобы самому розобратся
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
12.12.2009, 06:24     Системы счисления #9
Adramelah, в первом случае почитай про контейнер std::string , а во втором динамически выделяется память под строку , например в строке типа char x[15] ; 14 значимых символов и последний резервирется под нулевой символ , отсюда Hex[Digits]='\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;
}
outoftime
║XLR8║
508 / 430 / 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()) работает до тех пор пока размер строки не станет нуль.
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 15:56     Системы счисления #12
outoftime, Я немного не понял! Это ты мне объяснил так подробно??? или это что-то вроде условий???
outoftime
║XLR8║
508 / 430 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
12.12.2009, 16:13     Системы счисления #13
все что после примера не тебе
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 16:26     Системы счисления #14
так я уже выложил свой вариант для ввода строки, содержащей двоичное представление числа, и выводящей его шестнадцатиричное представление, ранее...

А если уж ставить условия, то хотелось бы предложить не использовать встроенные функции (кроме ввода-вывода), а писать исключительно свои, тогда и будет видно насколько коды отличаються друг от друга по размеру и эффективности!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2009, 17:26     Системы счисления
Еще ссылки по теме:

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

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

Системы счисления - C++
Нужно перевести 16 систему в 4,2.Нужно вводить число с клавиатуры.Не могу считать.Подскажите плс))))

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

Системы счисления - C++
Есть строка длинной 5000 символов из 0 и 1. Надо эту строку преобразовать в строку, которая представляет соответствующее десятичное число....


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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
508 / 430 / 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;
}
Это все на что у меня хватает фантазии..
Yandex
Объявления
12.12.2009, 17:26     Системы счисления
Ответ Создать тему
Опции темы

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