3 #ifndef CDSLIB_INT_ALGO_H
4 #define CDSLIB_INT_ALGO_H
6 #include <cds/algo/bitop.h>
8 namespace cds { namespace beans {
10 /// Returns largest previous integer for <tt>log2( n )</tt>
11 static inline size_t log2floor( size_t n )
13 return n ? cds::bitop::MSBnz( n ) : 0;
16 /// Returns smallest following integer for <tt>log2( n )</tt>
17 static inline size_t log2ceil( size_t n )
19 size_t i = log2floor( n );
20 return size_t( 1 << i ) < n ? i + 1 : i;
23 /// Returns largest previous power of 2 for \p n
37 static inline size_t floor2( size_t n )
39 return size_t(1) << log2floor( n );
42 /// Returns smallest following power of 2 for \p n
56 static inline size_t ceil2( size_t n )
58 return size_t(1) << log2ceil( n );
61 /// Checks if \p n is power of 2
62 CDS_CONSTEXPR static inline bool is_power2( size_t n ) CDS_NOEXCEPT
64 return (n & (n - 1)) == 0 && n;
67 /// Returns binary logarithm of \p n if \p n is power of two, otherwise returns 0
68 static inline size_t log2( size_t n )
70 return is_power2(n) ? log2floor(n) : 0;
72 }} // namespace cds::beans
74 #endif // #ifndef CDSLIB_INT_ALGO_H