HICONT

Set.h

Sep 23rd, 2022 (edited)
418
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 KB | None | 0 0
  1. #pragma once
  2. #include <string>
  3. #include <string.h>
  4. using namespace std;
  5. class TBitField
  6. {
  7. private:
  8.     unsigned int* mem;
  9.     int size;
  10. private:
  11.     //k - номер эл. универса, который хотим добавить u_size > k >= 1
  12.     int GetNumberMem(unsigned int k, unsigned int u_size)
  13.     {
  14.         int l = -1;
  15.         if (k >= 1 && k < u_size)
  16.         {
  17.             l = (k - 1) / (sizeof(int) * 8);
  18.         }
  19.         return l;
  20.     }
  21.     int GetNumberBit(unsigned int k, unsigned int u_size)
  22.     {
  23.         int l = -1;
  24.         if (k >= 1 && k < u_size)
  25.         {
  26.             l = (k - 1) % (sizeof(int) * 8);
  27.         }
  28.         return l;
  29.     }
  30. public:
  31.     TBitField(int u_size = 0)
  32.     {
  33.         size = u_size / (sizeof(int)*8) + 1;
  34.         mem = new unsigned int[size];
  35.         for (int i = 0; i < size; i++)
  36.         {
  37.             mem[i] = 0;
  38.         }
  39.     }
  40.     TBitField(const TBitField &tmp)
  41.     {
  42.         size = tmp.size;
  43.         mem = new unsigned int[size];
  44.         for (int i = 0; i < size; i++)
  45.         {
  46.             mem[i] = tmp.mem[i];
  47.         }
  48.     }
  49.     ~TBitField()
  50.     {
  51.         delete[] mem;
  52.     }
  53.     TBitField& operator=(TBitField tmp)
  54.     {
  55.         if (size != tmp.size)
  56.         {
  57.             if (size != 0)
  58.             {
  59.                 delete[] mem;
  60.             }
  61.             size = tmp.size;
  62.             mem = new unsigned int[size];
  63.         }
  64.         for (int i = 0; i < size; i++)
  65.         {
  66.             mem[i] = tmp.mem[i];
  67.         }
  68.         return *this;
  69.     }
  70.     void Add(unsigned int k, unsigned int u_size)
  71.     {
  72.         int pos = GetNumberBit(k, u_size);
  73.         int m = GetNumberMem(k, u_size);
  74.         mem[m] = mem[m] | (1 << pos);
  75.     }
  76.     string TBitField_to_String(unsigned int u_size)
  77.     {
  78.         string STR = "";
  79.         for (int i = 0; i < size; i++)
  80.         {
  81.             for (int j = 0; j < (sizeof(unsigned int) * 8); j++)
  82.             {
  83.                 int k = i * (sizeof(unsigned int) * 8) + j + 1;
  84.                 if (k <= u_size)
  85.                 {
  86.                     if (mem[i] & (1 << j))
  87.                     {
  88.                         STR = STR + " " + to_string(k); //к в строковой форме
  89.                     }
  90.                 }
  91.             }
  92.        }
  93.        return STR;
  94.     }
  95.     void del(unsigned int k, unsigned int u_size)
  96.     {
  97.         if (k > 0 && k <= u_size)
  98.         {
  99.             int pos = GetNumberBit(k, u_size);
  100.             int m = GetNumberMem(k, u_size);
  101.             mem[m] = mem[m] & (~(1 << pos));
  102.         }
  103.     }
  104.     TBitField operator&(TBitField tmp)
  105.     {
  106.         TBitField res;
  107.         if (size == tmp.size)
  108.         {
  109.             res = TBitField(*this);
  110.             for (int i = 0; i < size; i++)
  111.             {
  112.                 res.mem[i] = mem[i] & tmp.mem[i];
  113.             }
  114.         }
  115.         return res;
  116.     }
  117.     TBitField operator|(TBitField tmp)
  118.     {
  119.         TBitField res;
  120.         if (size == tmp.size)
  121.         {
  122.             res = TBitField(*this);
  123.             for (int i = 0; i < size; i++)
  124.             {
  125.                 res.mem[i] = mem[i] | tmp.mem[i];
  126.             }
  127.         }
  128.         return res;
  129.     }
  130.     TBitField operator~()
  131.     {
  132.         TBitField res(*this);
  133.         for (int i = 0; i < size; i++)
  134.         {
  135.             res.mem[i] = ~mem[i];
  136.         }
  137.         return res;
  138.     }
  139. };
Advertisement
Add Comment
Please, Sign In to add comment