Advertisement
orborbson

bits.cpp

Apr 4th, 2025 (edited)
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <cstdint>
  3. using namespace std;
  4.  
  5. template <typename T = uint16_t> // szablon, domyślnie uint16_t
  6. class bitx {
  7.     private:
  8.         volatile T _reg;
  9.         uint16_t _size;
  10.        
  11.     public:
  12.         bitx(T reg) : _reg(reg), _size(sizeof(T) << 3){}
  13.         bitx() : bitx(0){}
  14.        
  15.         bitx & operator = (T reg) noexcept{
  16.             _reg = reg;
  17.             return *this;
  18.         }
  19.        
  20.         operator T() const noexcept{
  21.             return _reg;
  22.         }
  23.        
  24.         // błąd (-1), wynik (0 lub 1)
  25.         inline int bit_get(uint16_t pos) const{
  26.             return (pos < _size ? ((_reg >> pos) & 0x1) : -1);
  27.         }
  28.        
  29.         // błąd (false), sukces (true)
  30.         inline bool bit_set(uint16_t pos, bool stat){
  31.             return (pos < _size) ? (stat ? (_reg |= (1 << pos)) : (_reg &= ~(1 << pos)), true) : false;
  32.         }
  33.        
  34.         // błąd (false), sukces (true)
  35.         bool bit_set_multi_low(uint16_t * pos, uint16_t size){
  36.             if(pos == nullptr || size > _size) return false;
  37.             T backup = _reg;
  38.             for(uint16_t i = 0; i < size; i++) if(pos[i] < _size){ _reg &= ~(1 << pos[i]); } else {_reg = backup; return false; }
  39.             return true;
  40.         }
  41.        
  42.         // błąd (false), sukces (true)
  43.         bool bit_set_multi_hi(uint16_t * pos, uint16_t size){
  44.             if(pos == nullptr || size > _size) return false;
  45.             T backup = _reg;
  46.             for(uint16_t i = 0; i < size; i++) if(pos[i] < _size){ _reg |= (1 << pos[i]); } else {_reg = backup; return false; }
  47.             return true;
  48.         }
  49.        
  50.         uint16_t bit_length() const noexcept{
  51.             return _size;
  52.         }
  53. };
  54.  
  55. int main(){
  56.     bitx<> reg = 0x0; // domyślnie "uint16_t" w nawiasie <>
  57.    
  58.     cout << "> liczba bitów w zmiennej, zakres [0-15]: " << reg.bit_length() << endl;
  59.     cout << "> początkowa wartość rejestru: " << reg << endl;
  60.    
  61.     uint16_t pos1 [] = {0, 2, 4, 6, 8, 10, 12}; // tablica bitów
  62.     cout << "\n> ustawiam bity [0, 2, 4, 6, 8, 10, 12] na high ... " << (reg.bit_set_multi_hi(pos1, sizeof(pos1)/sizeof(uint16_t)) ? "[ok]" : "[błąd]") << endl;
  63.     cout << "> wartość rejestru: " << reg << endl;
  64.    
  65.     cout << "\n> ustawiam bit7 na high ... " << (reg.bit_set(7, true) ? "[ok]" : "[błąd]") << endl;
  66.     cout << "> wartość rejestru: " << reg << endl;
  67.    
  68.     cout << "\n> ustawiam bit8 na low ... " << (reg.bit_set(8, false) ? "[ok]" : "[błąd]") << endl;
  69.     cout << "> wartość rejestru: " << reg << endl;
  70.    
  71.     cout << "\n> ustawiam bit5 na high ... " << (reg.bit_set(5, true) ? "[ok]" : "[błąd]") << endl;
  72.     cout << "> wartość rejestru: " << reg << endl;
  73.    
  74.     uint16_t pos2 [] = {4, 10};
  75.     cout << "\n> ustawiam bity [4, 10] na low ... " << (reg.bit_set_multi_low(pos2, sizeof(pos2)/sizeof(uint16_t)) ? "[ok]" : "[błąd]") << endl;
  76.     cout << "> wartość rejestru: " << reg << endl;
  77.    
  78.     cout << "\n> próbuję ustawić bit20 (poza zakresem) na high: " << (reg.bit_set(20, true) ? "[ok]" : "[błąd]") << endl;
  79.     cout << "> wartość rejestru po nieudanej próbie: " << reg << endl;
  80.    
  81.     cout << "\n> sprawdzam bit3 [" << reg.bit_get(3) << "] i bit7 [" << reg.bit_get(7) << "]\n";
  82.    
  83.     reg = 0x0;
  84.     cout << "\n> zeruję rejestr, teraz ma wartość: " << reg << endl;
  85.    
  86.     return 0;
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement