IMKYZABITCHES

Bitflag System - Bitwise

Jul 13th, 2015
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. // educational purposes, people need to finally learn how these work.
  2.  
  3. #include<stack>
  4. // ayyyyyyyyy lmao Bitwise ye tru
  5.  
  6. class Bitflag
  7. {
  8. public:
  9.     unsigned int m_flag;
  10.     Bitflag(unsigned int*pFlag) : m_flag(*pFlag), m_memory(false), m_address(0) {}
  11.     // random parameter used to avoid constructor confliction
  12.     Bitflag(unsigned int dwAddress, bool k) : m_flag(*(int*)(dwAddress)), m_memory(true), m_address(dwAddress) {}
  13.     Bitflag() : m_flag(0), m_address(0), m_memory(false) {}
  14.     inline bool valid();
  15.     inline bool contains(unsigned int dwValue);
  16.     inline stack<unsigned int> values();
  17.     void set(unsigned int value);
  18.     void unset(unsigned int value);
  19.     inline bool toggle(unsigned int value);
  20.     Bitflag& get() { return *this; }
  21. private:
  22.     bool m_memory;
  23.     unsigned int m_address;
  24. };
  25.  
  26. inline bool Bitflag::contains(unsigned int dwValue)
  27. {
  28.     return (this->m_flag & ~dwValue) != this->m_flag;
  29. }
  30.  
  31. inline bool Bitflag::valid()
  32. {
  33.     for(int i = 0; i < 0x20; i++)
  34.         if(this->contains(1 << i)) return true;
  35.     return false;
  36. }
  37.  
  38. inline stack<unsigned int> Bitflag::values()
  39. {
  40.     stack<unsigned int> flagData;
  41.     for(int i = 0; i < 0x20; i++)
  42.         if(this->contains(1 << i)) flagData.push(1 << i);
  43.     return flagData;
  44. }
  45.  
  46. void Bitflag::set(unsigned int value, bool lap)
  47. {
  48.     // confirm bitflag
  49.     if(!Bitflag(&value).valid()) { printf("flag %08X is invalid\n", value); return;}
  50.     // debugging
  51.     if(this->contains(value)) {
  52.         printf("flag %08X is already active\n", value);
  53.         return;
  54.     }
  55.     this->m_flag |= value;
  56.     if(this->m_memory) {
  57.         // debug purposes
  58.         printf("memory detected!\n");
  59.         *(unsigned int*)m_address |= lap ? this->m_flag : value;
  60.     }
  61. }
  62.  
  63. void Bitflag::unset(unsigned int value, bool lap)
  64. {
  65.     if(!Bitflag(&value).valid()) { printf("flag %08X is invalid\n", value); return;}
  66.     if(!this->contains(value)) {
  67.         printf("flag %08X is already not active\n", value);
  68.         return;
  69.     }
  70.     this->m_flag &= ~value;
  71.     if(this->m_memory) {
  72.         // debug purposes
  73.         printf("memory detected!\n");
  74.         *(unsigned int*)m_address &= lap ? ~this->m_flag : ~value;
  75.     }
  76. }
  77.  
  78. inline bool Bitflag::toggle(unsigned int value)
  79. {
  80.     this->contains(value) ? this->unset(value, false) : this->set(value, false);
  81.     return this->contains(value);
  82. }
Add Comment
Please, Sign In to add comment