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

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

Войти
Регистрация
Восстановить пароль
 
znseday
18 / 18 / 1
Регистрация: 20.03.2012
Сообщений: 483
#1

Перевод строки цифр произвольной длины во внутреннее двоичный код и обратно - C++

13.12.2015, 15:51. Просмотров 443. Ответов 6
Метки нет (Все метки)

Необходимо написать функции, которые переводят строку цифр в двоичный код (во внутреннем представлении) и обратно. Например:
C++
1
2
char a[256] = "123456789876554"; // входной параметр
unsugned buff[128]; // внутренне представление этого числа в двоичном виде
Добавлено через 1 час 2 минуты
Спасибо, задача решена.
Но если у кого есть какие алгоритмы все равно было бы любопытно взглянуть для сравнения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2015, 15:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перевод строки цифр произвольной длины во внутреннее двоичный код и обратно (C++):

Перевод даты из символьного формата во внутреннее представление и обратно - C++
Разработать функцию, которая переводит дату из символьного формата «дд.мм.гггг» во внутреннее представление и обратно.Только чтобы не...

перевод десятичного вещественного в машинный код(двоичный код) - C++
пожалуйста , подскажите пожалуйста код C++ ,для перевода вещественного числа в машиное (двоичное представление,32 бит). Без использования...

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

Перевод числа в двоичный код - C++
Знаю вопрос детский но как перевести число в двоичный код, в 16-й и в 8-й знаю %x и %o а вот в двоичный нет.

Перевод файла в двоичный код - C++
Привет всем. Возникла проблема: нужно любой файл перевести в двоичный код. Как это сделать средствами C++ или WInAPI?

Перевод чисел в двоичный код - C++
неподскажите как переводить числа в двоичный код в borland C 3.1 под dos

6
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
13.12.2015, 15:54 #2
znseday, так может вы покажите свой ?
0
znseday
18 / 18 / 1
Регистрация: 20.03.2012
Сообщений: 483
13.12.2015, 15:55  [ТС] #3
rikimaru2013, у меня пока очень через одно место, и еще не решена обратная задача...
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
13.12.2015, 16:02 #4
znseday, через одно или через другое - не важно! Выкладывайте, поможем улучшить и дописать.
0
znseday
18 / 18 / 1
Регистрация: 20.03.2012
Сообщений: 483
14.12.2015, 21:59  [ТС] #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
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
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
 
#define BUFF_SIZE 32
 
typedef  unsigned char  uchar;  // BYTE
 
// Вспомогательные функции взятые из какой-то вузовской методички
void add(uchar out[], uchar in1[], uchar in2[], int n)
{
    int i, carry;      // carry - бит переноса
    unsigned w;  //w-рабочая переменная для сложения двух байтов
    for (i=0, carry = 0; i<n; i++)
    {
       out[i] = w = in1[i] + in2[i]+carry;
       carry = (w & 0x0100)>>8;
    }
}
 
void lshift(uchar in[], int n)
{     int carry; //carry - бит переноса
      int i,z;
      for (carry=0, i=0; i<n; i++)
      {
          z=(in[i] & 0x80)>>7;    // Выделить старший бит (перенос)
          in[i]<<= 1;    // Сдвинуть влево и установить
          in[i] |=carry;  // старый перенос в младший бит
          carry = z;   // Запомнить новый перенос
      }
}
 
 
//Сдвиг вправо целых произвольной разрядности
void rshift(uchar in[], int n)
{
       int carry;  //carry - бит переноса
       int i,z;
       for (carry=0, i = n-1; i>=0; i--)
       {
            z = in[i] & 1;  // Выделить младший бит (перенос)
            in[i] >>= 1;  // Сдвинуть вправо и установить
            in[i] |= carry<<7;   // старый перенос в старший бит
            carry = z;    // Запомнить новый перенос
       }
}
 
//Умножение целых произвольной разрядности
void mul(uchar out[], uchar aa[], uchar bb[], int n) // n - кол-во байт
{
    int i;
    for (i=0; i<n; i++) out[i]=0;
 
    for (i=0; i< n*8; i++) // Цикл по количеству битов
    {
        if (bb[0] & 1 )    // Разряд множителя равен 1
            add(out,out,aa,n);   // Добавить множимое к произведению
        lshift(aa,n);    // Множимое - влево
        rshift(bb,n);   // Множитель - вправо
    }
}
 
// Далее - мой код
 
int _tmain(int argc, _TCHAR* argv[])
{
    int i,j; // счетчики для циклов
 
    char s1[128];  // Входная строка
 
    int n1; // Длина входной строки
 
//  cin>>s1;
 
    strcpy(s1, "567");    //  Для теста
 
    cout<<"s1 = "<<s1<<"\n";
 
    n1 = strlen(s1);  // Длина входной строки
 
    unsigned char buff_1[BUFF_SIZE];   memset(buff_1, 0, sizeof(buff_1));
    unsigned char buff_t[BUFF_SIZE];   memset(buff_t, 0, sizeof(buff_t));
 
    unsigned char buff_i10[BUFF_SIZE];  memset(buff_i10, 0, sizeof(buff_i10));
 
    unsigned char buff_d[BUFF_SIZE];   memset(buff_d, 0, sizeof(buff_d));
    unsigned char buff_r[BUFF_SIZE];   memset(buff_r, 0, sizeof(buff_r));
 
    for (i = n1-1; i >= 0; i--)
    {
        memset(buff_t, 0, sizeof(buff_t)); buff_t[0] = 1; 
 
        for (j = 0; j < i; j++)  // возведение в степень
        {
            memset(buff_i10, 0, sizeof(buff_i10)); buff_i10[0] = 10;
 
            mul(buff_r, buff_i10, buff_t, BUFF_SIZE);
 
            memcpy(buff_t, buff_r, BUFF_SIZE);
        }
 
        char ts[2];
        ts[0] = s1[n1-i-1];  ts[1] = '\0';
        int d = atoi(ts);
 
        memset(buff_d, 0, sizeof(buff_d)); buff_d[0] = d;
 
        mul(buff_r, buff_d, buff_t, BUFF_SIZE);
 
        memcpy(buff_t, buff_r, BUFF_SIZE);
 
        add(buff_1, buff_1, buff_t, BUFF_SIZE);
    }
 
    // Наш результат в buff_1 !!!!
// Проверял в отладчике - работает для данной входной строки.
 
    getch();
 
    return 0;
}
Я торопился, нужно было как можно скорее получить результат. Хотелось бы, конечно, иметь нормальный оптимизированный алгоритм/функцию для данной задачи.
Также хотелось бы решить обратную задачу: перевод числа произвольной длины из внутреннего бинарного представления (например, 256 битное целое число) в строку, состоящую из символов - десятичных цифр.
0
znseday
18 / 18 / 1
Регистрация: 20.03.2012
Сообщений: 483
17.12.2015, 16:11  [ТС] #6
Есть предложение почистить тему от флуда и перенести в раздел "с++ для экспертов". Может там кто поучаствует в обсуждении...
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 702
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
19.12.2015, 15:29 #7
znseday, вы, чтобы написать кому-нибудь ответ, кликайте сначала по нику того, кому отвечаете.
0
19.12.2015, 15:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2015, 15:29
Привет! Вот еще темы с ответами:

Перевод double в двоичный код - C++
Здравствуйте! Пожалуйста, скажите в какую сторону смотреть, не пойму как такое реализовать. С интом все просто, нужно делить,...

Дан текст произвольной длины, оканчивающийся точкой с запятой. Подсчитать количество цифр в тексте - C++
1Дан текст произвольной длины, оканчивающийся точкой с запятой. Подсчитать количество цифр в тексте. 2.Даны две строки длиной до 80...

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

Ввод строки с пробелами произвольной длины - C++
Помогите, пожалуйста. Нужно ввести строку произвольной длины с пробелами и различными символами. Мой код: char *s; s=new...


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

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

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