Библиотека String  1.0
Own String library. Лабораторная работа ФБИТ ИТМО
binstr.cpp
См. документацию.
1 /*!
2 \file
3 \brief Реализация методов класса "Битовая строка"
4 
5 Данный файл содержит в себе реализации методов производного
6 от "Строка" класса "Битовая строка"
7 */
8 #include <iostream>
9 #include <cstring>
10 
11 #include "own/string.h"
12 #include "own/binstr.h"
13 
14 namespace own {
15 
16 BinStr::BinStr(int val) : String(val)
17 {
18  std::cout << "BinStr::BinStr(int val) : Stroka(val), val=" << val << std::endl;
19 }
20 
21 BinStr::BinStr(const char* Str) : String(Str)
22 {
23  if (!((pCh[0] >= '0' && pCh[0] <= '9'))) {
24  std::cout << "Bad symbol, pCh[0]=" << pCh[0] << std::endl;
25  if (pCh) delete[] pCh;
26  len = 0;
27  pCh = new char[len + 1];
28  pCh[0] = '\0';
29  return;
30  }
31 
32  for (int i = 1; i < len; i++) {
33  if(!(pCh[i] >= '0'&& pCh[i] <= '9')) {
34  std::cout << "Bad string, pCh[" << i << "]=" << pCh[i] << std::endl;
35  if (pCh) delete[] pCh;
36  len = 0;
37  pCh = new char[len + 1];
38  pCh[0] = '\0';
39  return;
40  }
41  }
42  std::cout << "BinStr::BinStr( char* Str):String(Str)" << std::endl;
43  //cout << "fun1=" << fun1() << endl;
44 }
45 
46 BinStr::BinStr(const BinStr& from) : String(from)
47 {
48  std::cout << "BinStr::BinStr(const BinStr& from) : String(from)" << std::endl;
49 }
50 
52 {
53  std::cout << "BinStr::~BinStr()" << std::endl;
54 }
55 
56 int BinStr::getSign() const
57 {
58  if (pCh[0] == '1')
59  return SIGN::NEGATIVE;
60  else
61  return SIGN::POSITIVE;
62 }
63 
64 bool BinStr::isPositive() const
65 {
66  return getSign() == SIGN::POSITIVE;
67 }
68 
69 bool BinStr::isNegative() const
70 {
71  return getSign() == SIGN::NEGATIVE;
72 }
73 
75 {
76  int tmp = 0;
77  for (int i = 0; i < len; i++) {
78  tmp *= 2;
79  tmp += pCh[i]-'0';
80  }
81  return tmp;
82 }
83 
84 int BinStr::getNum() const
85 {
86  int tmp = 0;
87  if (isPositive()) {
88  for (int i = 0; i < len; i++) {
89  tmp *= 2;
90  tmp += pCh[i]-'0';
91  }
92  } else {
93  for (int i = 0; i < len; i++) {
94  tmp *= 2;
95  tmp += '1'-pCh[i];
96  }
97  tmp = -tmp - 1;
98  }
99  return tmp;
100 }
101 
103 {
104  if (&Ds != this) {
105  delete[] pCh;
106  len = strlen(Ds.pCh);
107  pCh = new char[len + 1];
108  strcpy(pCh, Ds.pCh);
109  }
110  std::cout << "BinStr& BinStr::operator=(const BinStr& Ds)" << std::endl;
111  return *this;
112 }
113 
114 BinStr operator^(const BinStr& pobj1, const BinStr& pobj2) {
115  if (pobj1.len >= pobj2.len) {
116  BinStr tmp(pobj1.len);
117  int i = pobj1.len - 1;
118  int j = pobj2.len - 1;
119  for (; j>=0; i--, j--) {
120  tmp.pCh[i] = (pobj1.pCh[i] == pobj2.pCh[j]) ? '0' : '1';
121  }
122  for (; i>=0; i--) {
123  tmp.pCh[i] = pobj1.pCh[i];
124  }
125  return tmp;
126  } else {
127  BinStr tmp(pobj2.len);
128  int i = pobj2.len - 1;
129  int j = pobj1.len - 1;
130  for (; j>=0; i--, j--) {
131  tmp.pCh[i] = (pobj2.pCh[i] == pobj1.pCh[j]) ? '0' : '1';
132  }
133  for (; i>=0; i--) {
134  tmp.pCh[i] = pobj2.pCh[i];
135  }
136  return tmp;
137  }
138 }
139 
140 BinStr operator^(int pobj1, const BinStr& pobj2) {
141  int pobj1len = 0;
142  int pobj1i = pobj1;
143  for (; pobj1i != 0; pobj1i >>= 1, pobj1len++);
144 
145  if (pobj1len >= pobj2.len) {
146  BinStr tmp(pobj1len);
147  int i = pobj1len - 1;
148  int j = pobj2.len - 1;
149  for (; j>=0; i--, j--) {
150  tmp.pCh[i] = ((pobj1 % 2) == (pobj2.pCh[j]-'0')) ? '0' : '1';
151  pobj1 >> 1;
152  }
153  for (; i>=0; i--) {
154  tmp.pCh[i] = (pobj1 % 2 == 0) ? '0' : '1';
155  pobj1 >> 1;
156  }
157  return tmp;
158  } else {
159  BinStr tmp(pobj2.len);
160  int i = pobj2.len - 1;
161  int j = pobj1len - 1;
162  for (; j>=0; i--, j--) {
163  tmp.pCh[i] = ((pobj2.pCh[i]-'0') == (pobj1 % 2)) ? '0' : '1';
164  pobj1 >> 1;
165  }
166  for (; i>=0; i--) {
167  tmp.pCh[i] = pobj2.pCh[i];
168  }
169  return tmp;
170  }
171 }
172 
173 BinStr operator^(const BinStr& pobj1, int pobj2) {
174  return pobj2^pobj1;
175 }
176 
177 int operator==(const BinStr& pobj1, const BinStr& pobj2) {
178  return pobj1.getNum() == pobj2.getNum();
179 }
180 
181 int operator==(const BinStr& pobj1, int pobj2) {
182  return pobj1.getNum() == pobj2;
183 }
184 
185 int operator==(int pobj1, const BinStr& pobj2) {
186  return pobj1 == pobj2.getNum();
187 }
188 
189 }
own::BinStr::isNegative
bool isNegative() const
Definition: binstr.cpp:69
own::BinStr::getSign
int getSign() const
Definition: binstr.cpp:56
binstr.h
Заголовочный файл с описанием класса "Битовая строка".
own::BinStr::getNum
int getNum() const
Definition: binstr.cpp:84
own::String
Базовый класс "Строка".
Definition: string.h:17
string.h
Заголовочный файл с описанием класса "Строка".
own::BinStr::BinStr
BinStr(int=0)
Definition: binstr.cpp:16
own::BinStr::isPositive
bool isPositive() const
Definition: binstr.cpp:64
own::BinStr::getUnsignedNum
int getUnsignedNum() const
Definition: binstr.cpp:74
own::BinStr::operator=
BinStr & operator=(const BinStr &)
Definition: binstr.cpp:102
own::String::pCh
char * pCh
Адрес динамически выделенной памяти для размещения символов строки
Definition: string.h:20
own::BinStr::~BinStr
~BinStr()
Definition: binstr.cpp:51
own::operator==
int operator==(const BinStr &pobj1, const BinStr &pobj2)
Definition: binstr.cpp:177
own::String::len
int len
Длина строки
Definition: string.h:19
own::BinStr
Производный от "Строка" класс "Битовая строка".
Definition: binstr.h:25
own::operator^
BinStr operator^(const BinStr &pobj1, const BinStr &pobj2)
Definition: binstr.cpp:114