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

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

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

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

02.08.2012, 21:18. Просмотров 5338. Ответов 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; без использования знаков '+' и '>>' ??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 21:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B (C++):

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

Сложение двоичных чисел - C++
Здравсвуйте! Даны два массива: int a = {1, 0, 0, 1}; // двоичное число 1001 int b = {0, 1, 1, 1}; // двоичное число 0111 ...

Сложение двоичных чисел, представленных в bitset - C++
Здравствуйте! Мне необходимо узнать, как можно реализовать сложение двоичных чисел, представленных в виде bitset (хотя бы инкремент)....

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

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

Арифметика в массивах целых чисел и строках - C++
Дан массив X из 10 элементов и дана строка, которая содержит команды вида: X-X+X. Нужно вывести результат этих действий. Вопрос в том,...

10
Charley
5 / 5 / 0
Регистрация: 11.06.2012
Сообщений: 173
02.08.2012, 21:40 #2
Могу предоставить арифметические операции для чисел в типе string http://code.google.com/p/nadosuge/do...A.zip&can=2&q=
Хотя они там используются как operator
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
02.08.2012, 22:16 #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) как у тебя
но порядок то все-таки смени ты начинаешь со старших битов а нужно с младших
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
03.08.2012, 06:22  [ТС] #4
Цитата Сообщение от ValeryS Посмотреть сообщение
но порядок то все-таки смени ты начинаешь со старших битов а нужно с младших
Не, задумка такая, что число я с младших битов записываю с начала массива

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

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

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

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

RaiaNKnight,
я вот что подумал
Мы на неправильном пути
если тебе потом придется сложить С и А то будут разные размеры придется приводить размер и так далее....
возьмем к примеру процессор у него размер регистра 8 байт(16,32,64)
и когда происходит переполнение то выставляется бит переноса
так надо и здесь
три массива по 8 (например ) два слагаемых, сумма и флаг переноса
если идет переполнение то выставляется флаг
тогда можно будет оформить отдельной функцией
типа
C++
1
bool AddBinary(int * arg1, int *arg2,int* summ,int size)
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
03.08.2012, 15:35  [ТС] #9
Это понятно.
Мне просто нужна была реализация с бинарными операторами. Это ведь интересней, чем через if'ы, да и быстрее
Я просто с самого начала как-то от флага хотел уйти
0
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2012, 16:40 #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;
}
1
Миниатюры
Сложение 2-х целых двоичных чисел, хранящихся в массивах A и B  
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
03.08.2012, 17:31  [ТС] #11
Спасибо, конечно.
Но мне не требовалось настолько проработанная консолька, для себя ведь Кормена разбираю, а не для галочки в универе
0
03.08.2012, 17:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2012, 17:31
Привет! Вот еще темы с ответами:

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

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

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

Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел - C++
Помогите пожалуйста с программой. Задан массив K(m) попарно различных целых чисел. Получить все перестановки целых чисел


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

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

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