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

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

Восстановить пароль Регистрация
 
Илья_007
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 6
20.05.2012, 21:49     Системы счисления #1
Реализовать модуль, обеспечивающий преобразование десятичных чисел в двоичные и наоборот. Двоичные числа хранить в виде массива целых чисел. Алгоритм преобразования необходимо реализовать самостоятельно, без использования форматных функций и т.п.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
softmob
1248 / 698 / 155
Регистрация: 20.02.2010
Сообщений: 1,035
20.05.2012, 22:23     Системы счисления #2
перевод из любой в любую [2, 16] для чисел любой длины
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
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
string integer(vector<int>& a, int q, int p, const string& u)
{
    string res;
    int demolition;
 
    do
    {
        vector<int>::size_type j = 0;
        demolition = 0;      
 
        for (vector<int>::size_type i = 0; i != a.size(); ++i)
        {       
            demolition *= q;        
            demolition += a[i];
 
            if (demolition < p && i && j) 
            {
                a[j] = 0; 
                j++;
            }
 
            if (demolition >= p) 
            {   
                a[j] = demolition / p;  
                demolition %= p;   
                ++j;
            }
        } 
 
        a.resize(j);
        res = u[demolition] + res;
    }
    while(!a.empty());
 
    return res; 
}
 
int main(void)
{     
    setlocale(LC_ALL,"Russian");
    string a, b, res, u("0123456789ABCDEF");
    int q, p;   
    cout << "Введите число: "; cin >> a;  
    cout << "Введите исходную систему счисления: "; cin >> q;
    cout << "Введите конечную систему счисления: "; cin >> p;
 
    vector<int> v(a.size());
    for (string::size_type i = 0; i != a.size(); ++i)
        v[i] = u.find(toupper(a[i])); 
    res = integer(v, q, p, u);      
    cout << string(80, '_') << res << endl;
    return 0;
}
Precise
26 / 26 / 1
Регистрация: 20.05.2012
Сообщений: 43
20.05.2012, 22:25     Системы счисления #3
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>
 
using namespace std;
void main()
{
  long a = 0;
  long bb = 0;
  const int N = 65;
  char str[N];
  int i = 0;
  int k;
  int tmp = 0;
  system("cls");
  cout << "Enter the number: ";
  cin >> a;
  for ( i = 0; i < N - 1; ++i)
  {
    str[i] = '0';
  }
  str[N - 1] = '\0';
  bb = a;
  i = 0;
  while (bb != 0)
  {
    if ((abs(bb) % 2) != 0)
      str[N - 2 - i] = '1';
    ++i;
    bb = abs(bb)/2;
   }
   cout << "Number has in third system: " << endl;
   cout << str << endl;
   getchar();
   tmp = 0;
   for(i = N - 2, k = 0; i >= 0; i--, k++)
     tmp=tmp+(str[i] - '0')*(2^k);
   cout<<"Number has in tenth system: "<<tmp;
   getchar();
}
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
20.05.2012, 23:02     Системы счисления #4
Быстрая функция для перевода числа в двоичную систему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int* toBin(int value)
{
    int* result = new int[16];
    int j = 0;
    for(unsigned int i = pow(2,15); i >= 1; i >>= 1)
    {
        if(value & i) result[j] = 1;
        else result[j] = 0;
        ++j;
    }
    return result;
}
Возвращает указатель на динамический массив целочисленного типа, память потом нужно очистить вызовом оператора delete [] имя переменной.

J можно объявить как register переменную.
Илья_007
0 / 0 / 0
Регистрация: 07.12.2011
Сообщений: 6
21.05.2012, 18:33  [ТС]     Системы счисления #5
спасибо огромное всем, но это не совсем то что мне надо, если не сложно прокомментируйте строки,я не очень понимаю это все, без комментарий тем более, а так хотябы попытаюсь переделать под себя..!(
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
21.05.2012, 20:53     Системы счисления #6
Я про свою функцию расскажу.
Собственно, код с коментариями
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int* toBin(int value) /*функция получает цифру, возвращает указатель на динамически созданный
массив. Может быть вы этого не проходили ещё, но это самый удобный способ. Если нужен другой, то могу переделать.*/
{
    int* result = new int[16]; //создаётся динамический массив из 16 элементов int
    int j = 0; //счётчик цикла. Вообще его можно вставить в объявление цикла for, но у меня так не компилируется
    for(unsigned int i = pow(2,15); i >= 1; i >>= 1)/*pow(int a,int b) возвращает a в степени b, следовательно начальное значение цикла будет 2^15,цикл будет работать, пока i больше или равно единице, >>= это операция побитового сдвига вправо с присваиванием */
    {
        if(value & i) result[j] = 1; /*здесь, с помощью операции побитового И, сравнивается 
введённое значение и переменная i (об этом ниже), затем j-ому элементу массива присваивается
или 1, или 0 */
        else result[j] = 0;
        ++j; // увеличиваем счётчик
    }
    return result; //возвращаем указатель на наш массив
}


Что происходит на итерациях цикла

Изначально переменной i присваивается значение 16284 (если я не ошибаюсь, а я, скорее всего, ошибаюсь ), что значит 100000000000000 в двоичной системе. Затем к i применяется операция >>= . Что при этом происходит:
Код
1. 100000000000000
2. 010000000000000
3. 001000000000000
...
15. 000000000000001
Затем, на каждой итерации цикла, эти значения сравниваются с двоичным значением value при помощи операции побитового И(&), например:
Код
010000000000000
010001000000101
-----------------
010000000000000
и если получившееся значение не равно 0, то в j-ный элемент массива пишется 1, иначе 0.

Ну как-то так

И ещё, если вам нужно перевести значение в систему счисления с основанием 16, то можно сделать так:
...

C++
1
2
int value = 1027; // Ну или любое другое значение.
cout << (int*)value << endl; //шестнадцатеричное значение value
Yandex
Объявления
21.05.2012, 20:53     Системы счисления
Ответ Создать тему
Опции темы

Текущее время: 03:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru