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

Арифметические операции с двоичными числами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.66
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
22.03.2011, 18:48     Арифметические операции с двоичными числами #1
Вопрос такой.
Вот задание:
Двоичные числа (разбор строки, формирование строки, операции сложения, вычитания, разные варианты вывода строки).
1. Создать программный класс (или несколько связанных классов) на языке С++, которые реализуют заданные алгоритмы / функции (по вариантам). В классах реализовать конструкторы (деструкторы), инкапсуляцию (сокрытие закрытых атрибутов через методы доступа), по возможности – открытые и закрытые методы обработки, перегрузку операторов, реализовать абстрактный класс на базе обычного, выделить интерфейс и др.


Может ли кто то мне помочь понять, что же я должен сделать. Вплане двоичных чисел.
Это двоичный калькулятор или что?
Что такое разбор строки.
Кто будет классом и где инкапсуляция?

Совсем чайник. Помогите пожалуйста. Код не надо, а именно концептууально, алгоритмически на примере.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2011, 18:48     Арифметические операции с двоичными числами
Посмотрите здесь:

Написать программу, которая демонстрирует выполнение операций с 12-разрядными двоичными числами C++
15. Создать класс LongLong для работы с целыми числами. Число должно быть представлено двумя полями.Реализовать арифметические операции C++
C++ Арифметичиские операции над двоичными числами
Побитовые операции с двоичными цифрами C++
C++ Провести операцию эквивалентности над двоичными числами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.03.2011, 20:21     Арифметические операции с двоичными числами #21
Про asm я случайно заговорил.) Просто на С++ этого сделать нельзя красиво и писать нормальный класс двоичных чисел на плюсах никто не станет. Преподу явно нужно другое что-то.)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 13:20  [ТС]     Арифметические операции с двоичными числами #22
Уважаемые ГУРУ! Я чайник!!!!

Давайте начнем с простого.
Как реализовать ввод двух десятичных чисел я знаю.

А как сделать:

введите 1 двоичное число
введите второе двоичное число
вывод: сумма=....


То есть я ввожу 101
потом 100
на выходе = сумма

как в коде сложить два эти числа?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 13:46     Арифметические операции с двоичными числами #23
как в коде сложить два эти числа?
Я же объяснил.)
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 0 (и перенос единицы в следующий разряд)
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 19:02  [ТС]     Арифметические операции с двоичными числами #24
А как я задаю число двоичное?
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
27.03.2011, 20:07     Арифметические операции с двоичными числами #25
В виде строки из нулей и единиц, возможно, фиксированной длины. Вы ж это все уже обсуждали, вроде
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 22:32  [ТС]     Арифметические операции с двоичными числами #26
Вот я блин дятел. Не пойму нифига пока.
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
29.03.2011, 22:37     Арифметические операции с двоичными числами #27
Ты хоть напиши, как строки хранить собираешься(ну, там std::string, CString, или банальный char*)...
Я тебе по минимуму класс накидаю...

Добавлено через 7 часов 20 минут
Вот тебе класс: На полноту не претендует. Ошибки не обрабатывает. С отрицательными числами я так и не понял что делать. Но концепцию я тебе вывел

Класс:
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
#ifndef __BINARY_H
#define __BINARY_H
 
#include <iostream>
#include <string>
 
class Binary  
{
public:
    Binary(const Binary& b = "");
    Binary& operator=(const Binary& b);
    Binary(const char*  b);
 
    Binary& operator +=(const Binary& b);
    Binary& operator -=(const Binary& b);
 
    friend std::ostream& operator <<(std::ostream& s, Binary& b)
    { return std::cout << b.data;}
    friend std::istream& operator >>(std::istream& s, Binary& b)
    { return std::cin  >> b.data;}
    
private:
    std::string data;
};
 
Binary operator +(const Binary& a, const Binary& b);
Binary operator -(const Binary& a, const Binary& b);
 
#endif __BINARY_H
Реализация:
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
#include "Binary.h"
 
#include <iostream>
#include <string>
 
/*Binary::Binary(std::string& b)
{
    data = b;   
}*/
 
Binary::Binary(const char *b)
{
    data = b;
}
 
 
Binary::Binary(const Binary &b)
{
    *this = b;
}
Binary& Binary::operator =(const Binary& b)
{
    data = b.data;
    return *this;
}
 
Binary& Binary::operator +=(const Binary& b)
{
    Binary t(b);                    // ÌîäèôèöèðîâГ*ГІГј Г*ГҐ èìååì ГЇГ°Г*ГўГ®...
    // Îïðåäåëÿåì Г*Г*èáîëåå äëèГ*Г*ГіГѕ ñòðîêó ГЁ ГІГі, 
    // êîòîðГ*Гї êîðî÷å, äîïîëГ*ГїГҐГ¬ Г±ГЇГ°Г*ГўГ* Г*óëÿìè.
    std::string tmp(abs(data.length()-t.data.length()),'0');
    if(data.length() > t.data.length())
        t.data = tmp + t.data;
    else
        data = tmp + data;
    
    // ÑîçäГ*ВёГ¬ äâГ* îáðГ*ГІГ*ûõ ГЁГІГҐГ°Г*òîðГ*, ГІ.ГЄ. äâèãГ*ГІГјГ±Гї áóäåì
    // Гў îáðГ*ГІГ*îì Г*Г*ГЇГ°Г*âëåГ*ГЁГЁ. ГІ.ГҐ. Г± ГЄГ®Г*Г¶Г* ñòðîêè Гў Г*Г*Г·Г*ëî.
    std::string::reverse_iterator riData = data.rbegin();
    std::string::reverse_iterator riBData = t.data.rbegin();
    int c = 0;                      // ÔëГ*ГЈ ïåðåГ*îñГ*.
    while(riData != data.rend())    // ÄâèãГ*åìñÿ ГЇГ® ñòðîêå Г± ГЄГ®Г*Г¶Г* Гў Г*Г*Г·Г*ëî.
    {
        int i1 = *riData - 0x30;    // ÏðåîáðГ*çîâûâГ*ГҐГ¬ ñèìâîëû Гў Г·ГЁГ±Г«Г*.
        int i2 = *riBData - 0x30;   // !!! ÀÊÒÓÀËÜÍÎ ÒÎËÜÊÎ ÄËß ASCII !!!
        int res = i1 + i2 + c;      // Âîò Г®Г*Г® ñëîæåГ*ГЁГҐ.
        c  = (res & 2) >> 1;        // Êîððåêòèðóåì ГґГ«Г*ГЈ ïåðåГ*îñГ*
        res &= 1;                   // Ïîñëå ýòîãî êîððåêòèðóåì ðåçóëüòГ*ГІ.
        *riData = res + 0x30;       // Г‡Г*ïèñûâГ*ГҐГ¬ îáðГ*ГІГ*Г®, ïðåîáðГ*çîâГ*Гў îáðГ*ГІГ*Г® Гў ñèìâîë
        riData++; riBData++;        // ÄâèãГ*åìñÿ Г¤Г*ëüøå...
    }
    if(c)                           // Åñëè ïåðåïîëГ*ГҐГ*ГЁГҐ
        data = '1' + data;
    return *this;
}
 
Binary& Binary::operator -=(const Binary& b)
{
    Binary t(b);                    // ÌîäèôèöèðîâГ*ГІГј Г*ГҐ èìååì ГЇГ°Г*ГўГ®...
    // Îïðåäåëÿåì Г*Г*èáîëåå äëèГ*Г*ГіГѕ ñòðîêó ГЁ ГІГі, 
    // êîòîðГ*Гї êîðî÷å, äîïîëГ*ГїГҐГ¬ Г±ГЇГ°Г*ГўГ* Г*óëÿìè.
    std::string tmp(abs(data.length()-t.data.length()),'0');
    if(data.length() > t.data.length())
        t.data = tmp + t.data;
    else
        data = tmp + data;
    
    // ÑîçäГ*ВёГ¬ äâГ* îáðГ*ГІГ*ûõ ГЁГІГҐГ°Г*òîðГ*, ГІ.ГЄ. äâèãГ*ГІГјГ±Гї áóäåì
    // Гў îáðГ*ГІГ*îì Г*Г*ГЇГ°Г*âëåГ*ГЁГЁ. ГІ.ГҐ. Г± ГЄГ®Г*Г¶Г* ñòðîêè Гў Г*Г*Г·Г*ëî.
    std::string::reverse_iterator riData = data.rbegin();
    std::string::reverse_iterator riBData = t.data.rbegin();
    int c = 0;                      // ÔëГ*ГЈ ïåðåГ*îñГ*.
    while(riData != data.rend())    // ÄâèãГ*åìñÿ ГЇГ® ñòðîêå Г± ГЄГ®Г*Г¶Г* Гў Г*Г*Г·Г*ëî.
    {
        int i1 = *riData - 0x30;    // ÏðåîáðГ*çîâûâГ*ГҐГ¬ ñèìâîëû Гў Г·ГЁГ±Г«Г*.
        int i2 = *riBData - 0x30;   // !!! ÀÊÒÓÀËÜÍÎ ÒÎËÜÊÎ ÄËß ASCII !!!
        int res = i1 - i2 - c;      // Âîò Г®Г*Г® âû÷èòГ*Г*ГЁГҐ.
        c  = (res & 2) >> 1;        // Êîððåêòèðóåì ГґГ«Г*ГЈ ïåðåГ*îñГ*
        res &= 1;                   // Ïîñëå ýòîãî êîððåêòèðóåì ðåçóëüòГ*ГІ.
        *riData = res + 0x30;       // Г‡Г*ïèñûâГ*ГҐГ¬ îáðГ*ГІГ*Г®, ïðåîáðГ*çîâГ*Гў îáðГ*ГІГ*Г® Гў ñèìâîë
        riData++; riBData++;        // ÄâèãГ*åìñÿ Г¤Г*ëüøå...
    }
    if(c)                           // Åñëè ïåðåïîëГ*ГҐГ*ГЁГҐ
        data = '1' + data;
    return *this;
}
 
// ----Óòèëèòû ГЄГ«Г*Г±Г±Г*----
// Ïîñëå îïðåëåëåГ*Г*ûõ ГґГіГ*êöèé +=,  -= ГЁ =
// ГґГіГ*êöèè ñëîæåГ*ГЁГї ГЁ âû÷èòГ*Г*ГЁГї îïðåäåëÿþòñÿ òðèâèГ*ëüГ*Г®:
Binary operator +(const Binary& a, const Binary& b)
{
    Binary t = a;
    return t += b;
}
 
Binary operator -(const Binary& a, const Binary& b)
{
    Binary t = a;
    return t -= b;
}
Тест:
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
#include <iostream>
#include "binary.h"
 
int main()
{
    Binary a;
    Binary b;
    Binary c;
    std::cin >> a >> b >> c;
 
    std::cout   << "a = " << a 
                << "\tb = " << b 
                << "\tc = " << c << std::endl;
    std::cout   << "a + b + c = " << a + b + c << std::endl
                << "a + b - c = " << a + b - c << std::endl
                << "a - b + c = " << a - b + c << std::endl
                << "a - b - c = " << a - b - c << std::endl;
    return 0;
}
 
Результат:
1100 10 1
a = 1100        b = 10  c = 1
a + b + c = 1111
a + b - c = 1101
a - b + c = 1011
a - b - c = 1001
Press any key to continue
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
04.04.2011, 18:46  [ТС]     Арифметические операции с двоичными числами #28
Спасибо конечно. Я пока в полном ауте.
Что означает:
!!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!

Добавлено через 1 минуту
Еще вопрос:
на вижуал с++ и дев.с++ работает?
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
05.04.2011, 12:02     Арифметические операции с двоичными числами #29
Вот тебе кусок таблицы:
Название: table.JPG
Просмотров: 152

Размер: 12.7 Кб
Из него (обведено красным карандашом) видно что для преобразования символа '0' в число 0 нужно из ASCII кода символа '0' вычесть 0x30. Тоже справедливо и для символа '1'.

Само собой разумеется, что тебя никто не вправе заставить использовать именно эту кодировку, но учти, что если будешь использовать альтернативу (скажем UNICODE), преобразовывать придется по другому...
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
05.04.2011, 12:06     Арифметические операции с двоичными числами #30
Цитата Сообщение от nikozavr Посмотреть сообщение
Еще вопрос:
на вижуал с++ и дев.с++ работает?
ДА.

Не знаю, будет ли работать на Borland'овских компиляторах, потому, что Borland я не люблю, а по сему не знаю.
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
05.04.2011, 12:09  [ТС]     Арифметические операции с двоичными числами #31
Что из представленных трех кусков кода надо компелировать?
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
05.04.2011, 12:18     Арифметические операции с двоичными числами #32
Все 3 куска. Первые 2 куска - это сам класс. 3-й кусок это тестовая программа. Только результат не компилируй. Будет ошибка.

P.S. Я собирал на VC++ 6.0
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
05.04.2011, 12:34  [ТС]     Арифметические операции с двоичными числами #33
А как три куска собрать в единое целое?
prZzZ
Программист
 Аватар для prZzZ
108 / 88 / 5
Регистрация: 22.03.2011
Сообщений: 232
05.04.2011, 13:16     Арифметические операции с двоичными числами #34
Вот, готовый, собранный проект:
Bin.rar
Само приложение находится в папке Release.
... Разбирайся!!! ...

P.S. И не забудь!!! Я ошибки не обрабатывал!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 12:41     Арифметические операции с двоичными числами
Еще ссылки по теме:

Арифметические операции над действительными числами согласно условию C++
C++ Выполнение арифметические действи над двоичными, восьмеричными или шестнадцатеричными числами (по блок-схеме)

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

Или воспользуйтесь поиском по форуму:
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
06.04.2011, 12:41  [ТС]     Арифметические операции с двоичными числами #35
VS 2008 - не работает.
Yandex
Объявления
06.04.2011, 12:41     Арифметические операции с двоичными числами
Ответ Создать тему
Опции темы

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