Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // educational purposes, people need to finally learn how these work.
- #include<stack>
- // ayyyyyyyyy lmao Bitwise ye tru
- class Bitflag
- {
- public:
- unsigned int m_flag;
- Bitflag(unsigned int*pFlag) : m_flag(*pFlag), m_memory(false), m_address(0) {}
- // random parameter used to avoid constructor confliction
- Bitflag(unsigned int dwAddress, bool k) : m_flag(*(int*)(dwAddress)), m_memory(true), m_address(dwAddress) {}
- Bitflag() : m_flag(0), m_address(0), m_memory(false) {}
- inline bool valid();
- inline bool contains(unsigned int dwValue);
- inline stack<unsigned int> values();
- void set(unsigned int value);
- void unset(unsigned int value);
- inline bool toggle(unsigned int value);
- Bitflag& get() { return *this; }
- private:
- bool m_memory;
- unsigned int m_address;
- };
- inline bool Bitflag::contains(unsigned int dwValue)
- {
- return (this->m_flag & ~dwValue) != this->m_flag;
- }
- inline bool Bitflag::valid()
- {
- for(int i = 0; i < 0x20; i++)
- if(this->contains(1 << i)) return true;
- return false;
- }
- inline stack<unsigned int> Bitflag::values()
- {
- stack<unsigned int> flagData;
- for(int i = 0; i < 0x20; i++)
- if(this->contains(1 << i)) flagData.push(1 << i);
- return flagData;
- }
- void Bitflag::set(unsigned int value, bool lap)
- {
- // confirm bitflag
- if(!Bitflag(&value).valid()) { printf("flag %08X is invalid\n", value); return;}
- // debugging
- if(this->contains(value)) {
- printf("flag %08X is already active\n", value);
- return;
- }
- this->m_flag |= value;
- if(this->m_memory) {
- // debug purposes
- printf("memory detected!\n");
- *(unsigned int*)m_address |= lap ? this->m_flag : value;
- }
- }
- void Bitflag::unset(unsigned int value, bool lap)
- {
- if(!Bitflag(&value).valid()) { printf("flag %08X is invalid\n", value); return;}
- if(!this->contains(value)) {
- printf("flag %08X is already not active\n", value);
- return;
- }
- this->m_flag &= ~value;
- if(this->m_memory) {
- // debug purposes
- printf("memory detected!\n");
- *(unsigned int*)m_address &= lap ? ~this->m_flag : ~value;
- }
- }
- inline bool Bitflag::toggle(unsigned int value)
- {
- this->contains(value) ? this->unset(value, false) : this->set(value, false);
- return this->contains(value);
- }
Add Comment
Please, Sign In to add comment