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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.62
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 464
Записей в блоге: 1
#1

Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B - C++

02.08.2012, 21:18. Просмотров 4735. Ответов 10
Метки нет (Все метки)

Задачка из Кормена. Результат записать в массив С.
Написал, что-то вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    int i,q=0;
    for(i=n-1;i>=0;i--)
    {
        c[n-i-1] = a[i]^b[i]^q;
        q = (q+a[i]+b[i])>>1;
    }
    if(q)
    { 
       c[n]=q; 
       i=n; 
    }
    else 
       i=n-1;
    for(;i>=0;i--)cout<<c[i];
    return 0;
}
Можно ли как-то проще записать вот это q=(q+a[i]+b[i])>>1; без использования знаков '+' и '>>' ??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 21:18     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B
Посмотрите здесь:

C++ Дан файл целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла.
Рекурсия: сложение, вычитание, деление и вычисление остатка от деления двух целых чисел C++
C++ вычисляющую сумму целых чисел, хранящихся в тексто¬вом файле
C++ Написать шаблоны функций для для вычисления суммы произведений двух соседних чисел для трех целых чисел и в одномерном массиве целых чисел
Дан файл целых чисел. Создать новый файл целых чисел, содержащий длины всех серий исходного файла C++
C++ Сложение двоичных чисел, представленных в bitset
C++ Деление двоичных чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Charley
5 / 5 / 0
Регистрация: 11.06.2012
Сообщений: 173
02.08.2012, 21:40     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #2
Могу предоставить арифметические операции для чисел в типе string http://code.google.com/p/nadosuge/do...A.zip&can=2&q=
Хотя они там используются как operator
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,471
02.08.2012, 22:16     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #3
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
a[i]^b[i]^q;
ты уверен что это сложение?
это "исключающая или"
логическое сложение это | "или"
арифметическое соответственно +
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
c[n-i-1] = a[i]^b[i]^q;
и чего то порядок то меняется??? старшие бита в младшие записываются?

Добавлено через 22 минуты
если тебе нужно логическое сложение

C++
1
2
3
4
 for(i=0;i<n;i)
    {
      c[i]=a[i]|b[i]; 
    }
если арифметическое то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int q=0;
int tmp,i;
for(i=0;i<n;i++)
{
 tmp=a[i]+b[i]+q;
   if(tmp==2)
   {
    q=1;
    tmp=0;
 }
if(tmp==3)
   {
    q=1;
    tmp=1;
 }
c[i]=tmp;
}
c[i]=q;
размер результирующего массива должен быть но один больше
ибо 11+11 =110

Добавлено через 5 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
ты уверен что это сложение?
это "исключающая или"
извини ступил
понял твою логику
ну тогда или тупо сравнения как у меня или сдвиг (деление на 2) как у тебя
но порядок то все-таки смени ты начинаешь со старших битов а нужно с младших
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 464
Записей в блоге: 1
03.08.2012, 06:22  [ТС]     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #4
Цитата Сообщение от ValeryS Посмотреть сообщение
но порядок то все-таки смени ты начинаешь со старших битов а нужно с младших
Не, задумка такая, что число я с младших битов записываю с начала массива

Сложение идет с младших битов обоих чисел и результат записывается в массив С с его начала

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

Или я чего-то не понимаю ?

Признаю - моя оплошность. Числа в массивах A и B записаны, начиная со старших битов, забыл указать
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,471
03.08.2012, 08:39     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #5
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Проблема в том, что число может получиться длины n+1 и тогда, если я буду записывать его с конца массива C, мне не хватит ячеек.
Или я чего-то не понимаю ?
сделай массив C[n+1] и записывай в старший бит 0 или 1,не надо будет заморачиваться с размером
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 464
Записей в блоге: 1
03.08.2012, 09:00  [ТС]     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #6
Цитата Сообщение от ValeryS Посмотреть сообщение
сделай массив C[n+1] и записывай в старший бит 0 или 1,не надо будет заморачиваться с размером
Ага,точно
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
03.08.2012, 09:53     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #7
Можно вместо массива C использовать вектор, и делать push_back
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,471
03.08.2012, 11:01     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #8
Цитата Сообщение от b_kasenov47 Посмотреть сообщение
Можно вместо массива C использовать вектор, и делать push_back
Не плодите сущности,без необходимости(с)

RaiaNKnight,
я вот что подумал
Мы на неправильном пути
если тебе потом придется сложить С и А то будут разные размеры придется приводить размер и так далее....
возьмем к примеру процессор у него размер регистра 8 байт(16,32,64)
и когда происходит переполнение то выставляется бит переноса
так надо и здесь
три массива по 8 (например ) два слагаемых, сумма и флаг переноса
если идет переполнение то выставляется флаг
тогда можно будет оформить отдельной функцией
типа
C++
1
bool AddBinary(int * arg1, int *arg2,int* summ,int size)
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 464
Записей в блоге: 1
03.08.2012, 15:35  [ТС]     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #9
Это понятно.
Мне просто нужна была реализация с бинарными операторами. Это ведь интересней, чем через if'ы, да и быстрее
Я просто с самого начала как-то от флага хотел уйти
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2012, 16:40     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #10
RaiaNKnight, вот что у меня вышло по твоей проблемме
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
#include <iostream>
using namespace std;
 
//Ïîëó÷Г*ГҐГІ Г¬Г*Г±Г±ГЁГў äâîè÷Г*îãî ïðåäñòГ*âëåГ*ГЁГї Г·ГЁГ±Г«Г* val
int * getBinArray(int val, int &n);
//ÔóГ*êöèÿ âîçâðГ*Г№Г*ГҐГІ Г¬Г*Г±Г±ГЁГў ñóììû äâóõ äâîè÷Г*ûõ ïðåäñòГ*âëåГ*ГЁГ©
int * getBinSum(int * a, int na, int *b, int nb, int &nc);
//ÔóГ*êöèÿ ïðåîáðГ*çóåò Г¬Г*Г±Г±ГЁГў äâîè÷Г*îãî ïðåäñòГ*âëåГ*ГЁГї Гў äåñÿòè÷Г*îå
int getDecValue(int * c, int nc);
//ÔóГ*êöèÿ ГЇГҐГ·Г*ГІГ*ГҐГІ Г*Г* ГЅГЄГ°Г*Г*ГҐ ýëåìåГ*ГІГ» îäГ*îìåðГ*îãî Г¬Г*Г±Г±ГЁГўГ*
void showVec(int * vec, int n);
 
int main()
{
    int a, b;
    cout<<"a = ";cin>>a;
    cout<<"b = ";cin>>b;
    int nA   = 0;
    int nB   = 0;
    int nC   = 0;
    int * binA = getBinArray(a, nA);
    int * binB = getBinArray(b, nB);
    int * binC = getBinSum(binA, nA, binB, nB, nC);
    cout<<"Binary a  : ";showVec(binA, nA);
    cout<<"Binary b  : ";showVec(binB, nB);
    cout<<"Binary c  : ";showVec(binC, nC);
    cout<<"Dec     c : "<<getDecValue(binC, nC)<<endl;
    cout<<"Dec a + b : "<<a + b<<endl;
    delete [] binA;
    delete [] binB;
    delete [] binC;
    return 0;
}
 
int * getBinArray(int val, int &n)
{
    n       = 1;
    int buf = val;
    while(buf /= 2)
        n = n + 1;
    int * arr = new int[n];
    for(int i = 0; i < n; i++)
    {
        arr[n - 1 - i] = val % 2;
        val            = val / 2;
    }
    return arr;
}
 
int * getBinSum(int * a, int na, int *b, int nb, int &nc)
{
    nc = 1 + ((na < nb) ? nb : na);
    int *c = new int[nc + 1];
    int shift = 0;
    for(int i = 0; i < nc; i++)
    {
        c[nc - 1 - i] = shift;
        if(i < na)
            c[nc - 1 - i] += a[na - 1 - i];
        if(i < nb)
            c[nc - 1 - i] += b[nb - 1 - i];
        shift= 0;
        if(1 < c[nc - 1 - i])
        {
            c[nc - 1 - i] = 0;
            shift= 1;
        }
    }
    return c;
}
 
int getDecValue(int * c, int nc)
{
    int val = 0;
    int pwr = 1;
    for(int i = 0; i < nc; i++)
    {
        val += c[nc - 1 - i]*pwr;
        pwr *= 2;
    }
    return val;
}
 
void showVec(int * vec, int n)
{
    for(int i = 0; i < n; i++)
        cout<<vec[i]<<" ";
    cout<<endl;
}
Миниатюры
Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2012, 17:31     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B
Еще ссылки по теме:

C++ Сложение двоичных чисел
Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел C++
C++ Файл: Написать программу, вычисляющую сумму целых чисел, хранящихся в текстовом файле
C++ Перегрузка операций для класса целых двоичных чисел в виде строк
C++ Запрос у пользователя поочередно двух целых чисел, и их сложение

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

Или воспользуйтесь поиском по форуму:
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 464
Записей в блоге: 1
03.08.2012, 17:31  [ТС]     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B #11
Спасибо, конечно.
Но мне не требовалось настолько проработанная консолька, для себя ведь Кормена разбираю, а не для галочки в универе
Yandex
Объявления
03.08.2012, 17:31     Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B
Ответ Создать тему
Опции темы

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