Skip to content

Commit

Permalink
'3'
Browse files Browse the repository at this point in the history
  • Loading branch information
Sedova-Olga committed Oct 13, 2023
1 parent 2b48d58 commit 7259d6c
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 63 deletions.
6 changes: 3 additions & 3 deletions include/tbitfield.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@
#pragma once
#include <iosfwd>

typedef size_t elType;
typedef size_t uint;

class TBitField
{
private:
size_t bitLen; // длина битового поля - макс. к-во битов
elType* pMem; // память для представления битового поля
uint* pMem; // память для представления битового поля
size_t memLen; // к-во эл-тов elType для представления бит.поля //длина массива pMem

// методы реализации
size_t getIndex(const size_t n) const; // индекс в pМем для бита n
elType getMask(const size_t n) const; // битовая маска для бита n
uint getMask(const size_t n) const; // битовая маска для бита n
public:
TBitField(size_t len);
TBitField(const TBitField& bf);
Expand Down
10 changes: 5 additions & 5 deletions include/tset.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@ class TSet

// доступ к битам
size_t getMaxPower() const; // максимальная мощность множества
void insElem(const elType elem); // включить элемент в множество
void delElem(const elType elem); // удалить элемент из множества
bool isMember(const elType elem) const; // проверить наличие элемента в множестве
void insElem(const uint elem); // включить элемент в множество
void delElem(const uint elem); // удалить элемент из множества
bool isMember(const uint elem) const; // проверить наличие элемента в множестве

// теоретико-множественные операции
bool operator==(const TSet &s) const; // сравнение
bool operator!=(const TSet &s) const; // сравнение
TSet& operator=(const TSet &s); // присваивание
TSet operator+(const elType elem); // объединение с элементом
TSet operator+(const uint elem); // объединение с элементом
// элемент должен быть из того же универса
TSet operator-(const elType elem); // разность с элементом
TSet operator-(const uint elem); // разность с элементом
// элемент должен быть из того же универса
TSet operator+(const TSet &s); // объединение
TSet operator*(const TSet &s); // пересечение
Expand Down
67 changes: 28 additions & 39 deletions src/tbitfield.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,37 +9,26 @@
#include <iostream>
#include "tbitfield.h"


TBitField::TBitField(size_t len)
{
if (len < 0)
{
throw len;
}
if (len == 0)
{
bitLen = len;
memLen = len;
pMem = nullptr;
}
if (len == 0) { bitLen = memLen = 0; pMem = nullptr; }
else
{
bitLen = len;
if (len % (sizeof(elType) * 8) != 0)
memLen = len / (sizeof(elType) * 8) + 1;
else
memLen = len / (sizeof(elType) * 8);
pMem = new elType[memLen];
for (int i = 0; i < memLen; i++) pMem[i] = 0;

memLen = len / sizeof(size_t) + 1;
pMem = new uint[memLen];
for (int i = 0; i < memLen; i++)
{
pMem[i] = 0;
}
}
}

TBitField::TBitField(const TBitField &bf) // конструктор копирования
TBitField::TBitField(const TBitField& bf) // конструктор копирования
{
bitLen = bf.bitLen;
memLen = bf.memLen;
pMem = new elType[memLen];
pMem = new uint[memLen];
for (int i = 0; i < memLen; i++) {
pMem[i] = bf.pMem[i];
}
Expand All @@ -50,26 +39,26 @@ size_t TBitField::getIndex(const size_t n) const // индекс в pМем д
return (n / sizeof(size_t));
}

elType TBitField::getMask(const size_t n) const // битовая маска для бита n
uint TBitField::getMask(const size_t n) const // битовая маска для бита n
{
return elType(1) << (n % sizeof(size_t));
return uint(1) << (n % sizeof(size_t));
}

// доступ к битам битового поля
size_t TBitField::getLength() const // получить длину (к-во битов)
uint TBitField::getLength() const // получить длину (к-во битов)
{
return bitLen;
}

size_t TBitField::getNumBytes() const // получить количество байт выделенной памяти
{
return memLen * sizeof(elType);
return memLen * sizeof(uint);
}

void TBitField::setBit(const size_t n) // установить бит
{
if (n >= 0 && n < bitLen) {
elType x = getMask(n);
uint x = getMask(n);
size_t i = getIndex(n);
pMem[i] |= x;
}
Expand All @@ -79,7 +68,7 @@ void TBitField::setBit(const size_t n) // установить бит
void TBitField::clrBit(const size_t n) // очистить бит
{
if (n >= 0 && n < bitLen) {
elType x = getMask(n);
uint x = getMask(n);
size_t i = getIndex(n);
pMem[i] &= (~x);
}
Expand All @@ -89,7 +78,7 @@ void TBitField::clrBit(const size_t n) // очистить бит
bool TBitField::getBit(const size_t n) const // получить значение бита
{
if (n >= 0 && n < bitLen) {
elType x = getMask(n);
uint x = getMask(n);
size_t i = getIndex(n);
bool bit = pMem[i] & x;
return bit;
Expand All @@ -99,28 +88,28 @@ bool TBitField::getBit(const size_t n) const // получить значени
}

// битовые операции
TBitField& TBitField::operator=(const TBitField &bf) // присваивание
TBitField& TBitField::operator=(const TBitField& bf) // присваивание
{
if (this != &bf)
{
if (bf.bitLen != this->bitLen) {
delete[] pMem;
bitLen = bf.bitLen;
memLen = bf.memLen;
pMem = new elType[memLen];
pMem = new uint[memLen];
}
for (int i = 0; i < memLen; i++) {
pMem[i] = bf.pMem[i];
}
for (int i = (memLen - 1) * sizeof(elType); i < bitLen; i++) {
for (int i = (memLen - 1) * sizeof(uint); i < bitLen; i++) {
if (bf.getBit(i))
setBit(i);
}
}
return *this;
}

bool TBitField::operator==(const TBitField &bf) const // сравнение
bool TBitField::operator==(const TBitField& bf) const // сравнение
{
if (this != &bf)
{
Expand All @@ -136,7 +125,7 @@ bool TBitField::operator==(const TBitField &bf) const // сравнение
return true;
}

bool TBitField::operator!=(const TBitField &bf) const // сравнение
bool TBitField::operator!=(const TBitField& bf) const // сравнение
{
if (this != &bf) {
if (bf.bitLen != this->bitLen)
Expand All @@ -149,7 +138,7 @@ bool TBitField::operator!=(const TBitField &bf) const // сравнение
return false;
}

TBitField TBitField::operator|(const TBitField &bf) // операция "или"
TBitField TBitField::operator|(const TBitField& bf) // операция "или"
{
if (this == &bf)
return *this;
Expand All @@ -168,10 +157,10 @@ TBitField TBitField::operator|(const TBitField &bf) // операция "или"
tbitfield.pMem[i] |= bf.pMem[i];
}
}
return tbitfield;
return tbitfield;
}

TBitField TBitField::operator&(const TBitField &bf) // операция "и"
TBitField TBitField::operator&(const TBitField& bf) // операция "и"
{
if (this == &bf)
return *this;
Expand Down Expand Up @@ -211,20 +200,20 @@ TBitField::~TBitField()
}

// ввод/вывод
std::istream &operator>>(std::istream &istr, TBitField &bf) // ввод
std::istream& operator>>(std::istream& istr, TBitField& bf) // ввод
{
for (int i = 0; i < bf.memLen; ++i)
istr >> bf.pMem[i];
return istr;
}

std::ostream &operator<<(std::ostream &ostr, const TBitField &bf) // вывод
std::ostream& operator<<(std::ostream& ostr, const TBitField& bf) // вывод
{
for (int i = 0; i < bf.bitLen; i++){
for (int i = 0; i < bf.bitLen; i++) {
if (bf.getBit(i))
ostr << '1';
else
ostr << '0';
}
return ostr;
}
}
32 changes: 16 additions & 16 deletions src/tset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ TSet::TSet(size_t mp) : bitField(1) {
}

// конструктор копирования
TSet::TSet(const TSet &s) : bitField(s.bitField) {
TSet::TSet(const TSet& s) : bitField(s.bitField) {
maxPower = s.maxPower;
bitField = s.bitField;
}

// конструктор преобразования типа
TSet::TSet(const TBitField &bf) : bitField(bf) {
TSet::TSet(const TBitField& bf) : bitField(bf) {
maxPower = bf.getLength();
bitField = bf;
}
Expand All @@ -37,23 +37,23 @@ size_t TSet::getMaxPower() const // получить макс. к-во эл-то
return maxPower;
}

bool TSet::isMember(const elType elem) const // элемент множества?
bool TSet::isMember(const uint elem) const // элемент множества?
{
return bitField.getBit(elem);
}

void TSet::insElem(const elType elem) // включение элемента множества
void TSet::insElem(const uint elem) // включение элемента множества
{
bitField.setBit(elem);
}

void TSet::delElem(const elType elem) // исключение элемента множества
void TSet::delElem(const uint elem) // исключение элемента множества
{
bitField.clrBit(elem);
}

// теоретико-множественные операции
TSet& TSet::operator=(const TSet &s) // присваивание
TSet& TSet::operator=(const TSet& s) // присваивание
{
if (this != &s) {
maxPower = s.maxPower;
Expand All @@ -62,45 +62,45 @@ TSet& TSet::operator=(const TSet &s) // присваивание
return *this;
}

bool TSet::operator==(const TSet &s) const // сравнение
bool TSet::operator==(const TSet& s) const // сравнение
{
if (maxPower == s.maxPower && bitField == s.bitField)
return 1;
else
return 0;
}

bool TSet::operator!=(const TSet &s) const // сравнение
bool TSet::operator!=(const TSet& s) const // сравнение
{
if (maxPower != s.maxPower || bitField != s.bitField)
return 1;
else
return 0;
}

TSet TSet::operator+(const TSet &s) // объединение
TSet TSet::operator+(const TSet& s) // объединение
{
TSet Set(bitField | s.bitField);
return Set;
}

TSet TSet::operator+(const elType elem) // объединение с элементом
TSet TSet::operator+(const uint elem) // объединение с элементом
{
TSet Set(*this);
if (!isMember(elem))
Set.insElem(elem);
return Set;
}

TSet TSet::operator-(const elType elem) // разность с элементом
TSet TSet::operator-(const uint elem) // разность с элементом
{
TSet Set(*this);
if (isMember(elem))
Set.delElem(elem);
return Set;
}

TSet TSet::operator*(const TSet &s) // пересечение
TSet TSet::operator*(const TSet& s) // пересечение
{
TSet Set(bitField & s.bitField);
return Set;
Expand All @@ -113,18 +113,18 @@ TSet TSet::operator~() // дополнение
}

// перегрузка ввода/вывода
std::istream &operator>>(std::istream &istr, TSet &s) // ввод
std::istream& operator>>(std::istream& istr, TSet& s) // ввод
{
istr >> s.bitField;
s.maxPower = s.bitField.getLength();
return istr;
}

std::ostream& operator<<(std::ostream &ostr, const TSet &s) // вывод
std::ostream& operator<<(std::ostream& ostr, const TSet& s) // вывод
{
for (int i = 0; i < s.maxPower; i++){
for (int i = 0; i < s.maxPower; i++) {
if (s.isMember(i))
ostr << i << ' ';
}
return ostr;
}
}

0 comments on commit 7259d6c

Please sign in to comment.