Changeset 8ca60e4
- Timestamp:
- Jan 25, 2024, 10:04:17 AM (11 months ago)
- Branches:
- master
- Children:
- 36e120a
- Parents:
- 5764204
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/utility.h
r5764204 r8ca60e4 111 111 }; 112 112 113 // -----------------------------------------------------------------------------114 // O(1) polymorphic integer ilog2, using clz, which returns the number of leading 0-bits, starting at the most115 // significant bit (single instruction on x86)116 117 template<typename T>118 inline119 #if defined(__GNUC__) && __GNUC__ > 4120 constexpr121 #endif122 T ilog2(const T & t) {123 if(std::is_integral<T>::value) {124 const constexpr int r = sizeof(t) * __CHAR_BIT__ - 1;125 if( sizeof(T) == sizeof(unsigned int) ) return r - __builtin_clz ( t );126 if( sizeof(T) == sizeof(unsigned long) ) return r - __builtin_clzl ( t );127 if( sizeof(T) == sizeof(unsigned long long) ) return r - __builtin_clzll( t );128 }129 assert(false);130 return -1;131 } // ilog2132 133 113 // Local Variables: // 134 114 // tab-width: 4 //
Note: See TracChangeset
for help on using the changeset viewer.