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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 64, средняя оценка - 4.66
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
#1

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

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

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


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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
bigredcat
365 / 312 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
24.03.2011, 20:04 #16
Ну, да. Значение в eax возвращается. Это было для наглядности
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.03.2011, 20:07 #17
Даже так, пожалуй.
C++
1
2
3
4
5
6
7
8
unsigned eflags()
{
    __asm
    {
        mov eax, 2
        add eax, 0xffffffff
    }
}
Но ведь это не решение проблемы.)

Добавлено через 44 секунды
А вобще, что там куда прибавляли, я даже не посмотрел.)))
eax не регистр флагов.)

Добавлено через 39 секунд
Какую-то ерунду вообще написали... я...
0
bigredcat
365 / 312 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
24.03.2011, 20:13 #18
C++
1
2
3
add u0, eax
pushfd   // После сложения заталкиваем в стек содержимое регистра флагов
pop eax  // Извлекаем, то что было в регистре флагов
Где ерунда?О_о
И почему не решение проблемы? Возиться с двоичной арифметикой проще? Реализовывать тот же самый регистр флагов, пусть и не в полнои объеме.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.03.2011, 20:16 #19
Я же конкретизировал, где:
Цитата Сообщение от Deviaphan Посмотреть сообщение
я...
0
bigredcat
24.03.2011, 20:17
  #20

Не по теме:

Чет это уже оффтоп
Да, я понял. Я про то что в #15 у вас все правильно

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

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

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

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


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

как в коде сложить два эти числа?
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.03.2011, 13:46 #23
как в коде сложить два эти числа?
Я же объяснил.)
0+0 = 0
0+1 = 1
1+0 = 1
1+1 = 0 (и перенос единицы в следующий разряд)
0
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 19:02  [ТС] #24
А как я задаю число двоичное?
0
bigredcat
365 / 312 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
27.03.2011, 20:07 #25
В виде строки из нулей и единиц, возможно, фиксированной длины. Вы ж это все уже обсуждали, вроде
0
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
27.03.2011, 22:32  [ТС] #26
Вот я блин дятел. Не пойму нифига пока.
0
prZzZ
Программист
112 / 92 / 5
Регистрация: 22.03.2011
Сообщений: 235
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
0
nikozavr
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 281
04.04.2011, 18:46  [ТС] #28
Спасибо конечно. Я пока в полном ауте.
Что означает:
!!! АКТУАЛЬНО ТОЛЬКО ДЛЯ ASCII !!!

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

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

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

Не знаю, будет ли работать на Borland'овских компиляторах, потому, что Borland я не люблю, а по сему не знаю.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2011, 12:06
Привет! Вот еще темы с ответами:

Провести операцию эквивалентности над двоичными числами - C++
Всем привет. Мне нужно провести операцию эквивалентности над двоичными числами. проблема в том, что я не знаю, как написать в С++ операцию...

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

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

Быстрые арифметические операции - C++
Здравствуйте. Я знаю, что в си++ есть понятие быстрых арифметических операций (не могу вспомнить термин). Т.е. не нужно писать i = i +1,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.04.2011, 12:06
Ответ Создать тему
Опции темы

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