1 /* 2 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 3 * Distributed under the MIT License 4 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 5 */ 6 7 #ifndef MYGUI_BITWISE_H_ 8 #define MYGUI_BITWISE_H_ 9 10 #include "MyGUI_Prerequest.h" 11 12 namespace MyGUI 13 { 14 15 class Bitwise 16 { 17 public: 18 /** Returns the closest power-of-two number greater or equal to value. 19 */ 20 template<typename Type> firstPO2From(Type _value)21 static inline Type firstPO2From(Type _value) 22 { 23 --_value; 24 _value |= _value >> 16; 25 _value |= _value >> 8; 26 _value |= _value >> 4; 27 _value |= _value >> 2; 28 _value |= _value >> 1; 29 ++_value; 30 return _value; 31 } 32 33 /** Determines whether the number is power-of-two or not. */ 34 template<typename Type> isPO2(Type _value)35 static inline bool isPO2(Type _value) 36 { 37 return (_value & (_value - 1)) == 0; 38 } 39 40 /** Returns the number of bits a pattern must be shifted right by to 41 remove right-hand zeros. 42 */ 43 template<typename Type> getBitShift(Type _mask)44 static inline size_t getBitShift(Type _mask) 45 { 46 if (_mask == 0) 47 return 0; 48 49 size_t result = 0; 50 while ((_mask & 1) == 0) 51 { 52 ++result; 53 _mask >>= 1; 54 } 55 return result; 56 } 57 }; 58 59 } // namespace MyGUI 60 61 #endif // MYGUI_BITWISE_H_ 62