Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/82: Рейтинг темы: голосов - 82, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281

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

22.03.2011, 18:48. Показов 17542. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос такой.
Вот задание:
Двоичные числа (разбор строки, формирование строки, операции сложения, вычитания, разные варианты вывода строки).
1. Создать программный класс (или несколько связанных классов) на языке С++, которые реализуют заданные алгоритмы / функции (по вариантам). В классах реализовать конструкторы (деструкторы), инкапсуляцию (сокрытие закрытых атрибутов через методы доступа), по возможности – открытые и закрытые методы обработки, перегрузку операторов, реализовать абстрактный класс на базе обычного, выделить интерфейс и др.


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

Совсем чайник. Помогите пожалуйста. Код не надо, а именно концептууально, алгоритмически на примере.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2011, 18:48
Ответы с готовыми решениями:

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

Арифметичиские операции над двоичными числами
Всем привет)) хочу показать то, что у меня вышло по данному вопросу. А вопрос был таким (сам себе его поставил): сделать арифметичиские...

Реализовать арифметические операции с комплексными числами
Создайте структуру, описывающую комплексное число. Реализуйте арифметические операции с комплексными числами: сумму, разность, умножение,...

34
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
24.03.2011, 20:21
Студворк — интернет-сервис помощи студентам
Про asm я случайно заговорил.) Просто на С++ этого сделать нельзя красиво и писать нормальный класс двоичных чисел на плюсах никто не станет. Преподу явно нужно другое что-то.)
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 13:20  [ТС]
Уважаемые ГУРУ! Я чайник!!!!

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

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

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


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

как в коде сложить два эти числа?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 13:46
как в коде сложить два эти числа?
Я же объяснил.)
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 0 (и перенос единицы в следующий разряд)
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 19:02  [ТС]
А как я задаю число двоичное?
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
27.03.2011, 20:07
В виде строки из нулей и единиц, возможно, фиксированной длины. Вы ж это все уже обсуждали, вроде
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 22:32  [ТС]
Вот я блин дятел. Не пойму нифига пока.
0
Программист
 Аватар для prZzZ
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
29.03.2011, 22:37
Ты хоть напиши, как строки хранить собираешься(ну, там 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
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
04.04.2011, 18:46  [ТС]
Спасибо конечно. Я пока в полном ауте.
Что означает:
!!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!

Добавлено через 1 минуту
Еще вопрос:
на вижуал с++ и дев.с++ работает?
0
Программист
 Аватар для prZzZ
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
05.04.2011, 12:02
Вот тебе кусок таблицы:
Название: table.JPG
Просмотров: 169

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

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

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

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

P.S. И не забудь!!! Я ошибки не обрабатывал!!!
0
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
06.04.2011, 12:41  [ТС]
VS 2008 - не работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2011, 12:41

Длинная арифметика: арифметические операции над числами
Срочно нужны исходники (функции): 1. Перевод обычного числа в длинное (массив, строка , вектор кто с чем работает) 2. Нахождение суммы...

Арифметические операции над действительными числами согласно условию
Даны действительные числа x и y. Если оба числа положительны и ни одно из них не принадлежит отрезку , то оба числа разделить на 2, иначе...

С помощью операторов выбора реализовать арифметические операции над двумя числами
Помогите пожалуйста. Надо Вести с клавиатуры 2 числа с помощью операторов выбора реализовать арифметические операции над этими числами. ...

Структуры: арифметические операции (сложение, вычитание, умножение, деление) над комплексными числами
Написать программу, реализующую арифметические операции (сложение, вычитание, умножение, деление), над комплексными числами. Использовать...

15. Создать класс LongLong для работы с целыми числами. Число должно быть представлено двумя полями.Реализовать арифметические операции
Добрый вечер,вот задание: Создать класс LongLong для работы с целыми числами из 64 бит. Число должно быть представлено двумя полями: long...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru