Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <string>
- #include <string.h>
- using namespace std;
- class TBitField
- {
- private:
- unsigned int* mem;
- int size;
- private:
- //k - номер эл. универса, который хотим добавить u_size > k >= 1
- int GetNumberMem(unsigned int k, unsigned int u_size)
- {
- int l = -1;
- if (k >= 1 && k < u_size)
- {
- l = (k - 1) / (sizeof(int) * 8);
- }
- return l;
- }
- int GetNumberBit(unsigned int k, unsigned int u_size)
- {
- int l = -1;
- if (k >= 1 && k < u_size)
- {
- l = (k - 1) % (sizeof(int) * 8);
- }
- return l;
- }
- public:
- TBitField(int u_size = 0)
- {
- size = u_size / (sizeof(int)*8) + 1;
- mem = new unsigned int[size];
- for (int i = 0; i < size; i++)
- {
- mem[i] = 0;
- }
- }
- TBitField(const TBitField &tmp)
- {
- size = tmp.size;
- mem = new unsigned int[size];
- for (int i = 0; i < size; i++)
- {
- mem[i] = tmp.mem[i];
- }
- }
- ~TBitField()
- {
- delete[] mem;
- }
- TBitField& operator=(TBitField tmp)
- {
- if (size != tmp.size)
- {
- if (size != 0)
- {
- delete[] mem;
- }
- size = tmp.size;
- mem = new unsigned int[size];
- }
- for (int i = 0; i < size; i++)
- {
- mem[i] = tmp.mem[i];
- }
- return *this;
- }
- void Add(unsigned int k, unsigned int u_size)
- {
- int pos = GetNumberBit(k, u_size);
- int m = GetNumberMem(k, u_size);
- mem[m] = mem[m] | (1 << pos);
- }
- string TBitField_to_String(unsigned int u_size)
- {
- string STR = "";
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < (sizeof(unsigned int) * 8); j++)
- {
- int k = i * (sizeof(unsigned int) * 8) + j + 1;
- if (k <= u_size)
- {
- if (mem[i] & (1 << j))
- {
- STR = STR + " " + to_string(k); //к в строковой форме
- }
- }
- }
- }
- return STR;
- }
- void del(unsigned int k, unsigned int u_size)
- {
- if (k > 0 && k <= u_size)
- {
- int pos = GetNumberBit(k, u_size);
- int m = GetNumberMem(k, u_size);
- mem[m] = mem[m] & (~(1 << pos));
- }
- }
- TBitField operator&(TBitField tmp)
- {
- TBitField res;
- if (size == tmp.size)
- {
- res = TBitField(*this);
- for (int i = 0; i < size; i++)
- {
- res.mem[i] = mem[i] & tmp.mem[i];
- }
- }
- return res;
- }
- TBitField operator|(TBitField tmp)
- {
- TBitField res;
- if (size == tmp.size)
- {
- res = TBitField(*this);
- for (int i = 0; i < size; i++)
- {
- res.mem[i] = mem[i] | tmp.mem[i];
- }
- }
- return res;
- }
- TBitField operator~()
- {
- TBitField res(*this);
- for (int i = 0; i < size; i++)
- {
- res.mem[i] = ~mem[i];
- }
- return res;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment