Tinker9 70bd052 (Thu Nov 9 12:11:35 2023 -0800)
Loading...
Searching...
No Matches
pow2.h
1#pragma once
2#include <cstddef>
3
4// constexpr functions
5namespace tinker {
8constexpr bool isPow2(size_t val)
9{
10 return (val != 0) && ((val & (val - 1)) == 0);
11}
12
15constexpr int pow2(int val)
16{
17 return 1 << val;
18}
19
22constexpr long long pow2ll(int val)
23{
24 return 1ll << val;
25}
26
31constexpr int floorLog2_constexpr(size_t val)
32{
33 return val < 2 ? 0 : 1 + floorLog2_constexpr(val >> 1);
34}
35
39constexpr size_t pow2Le(size_t val)
40{
41 return 1ull << floorLog2_constexpr(val);
42}
43
46constexpr size_t pow2Ge(size_t val)
47{
48 return val <= 1 ? 1 : (1ull << (1 + floorLog2_constexpr(val - 1)));
49}
50}
51
52// inline functions
53namespace tinker {
56inline int floorLog2(int val)
57{
58 if (val == 0) return 0;
59 int c = __builtin_clz(val);
60 return 8 * sizeof(int) - 1 - c;
61}
62
65inline int floorLog2(long long val)
66{
67 if (val == 0) return 0;
68 int c = __builtin_clzll(val);
69 return 8 * sizeof(long long) - 1 - c;
70}
71
74inline int ceilLog2(int val)
75{
76 return floorLog2(val) + (val & (val - 1) ? 1 : 0);
77}
78
81inline int ceilLog2(long long val)
82{
83 return floorLog2(val) + (val & (val - 1) ? 1 : 0);
84}
85}
constexpr int pow2(int val)
Integer base 2 power.
Definition: pow2.h:15
constexpr long long pow2ll(int val)
Long long integer base 2 power.
Definition: pow2.h:22
int floorLog2(int val)
Non-constexpr floorLog2(int).
Definition: pow2.h:56
int ceilLog2(int val)
Non-constexpr log base 2 ceiling.
Definition: pow2.h:74
constexpr size_t pow2Le(size_t val)
A power of 2 that is less than or equal to val.
Definition: pow2.h:39
constexpr size_t pow2Ge(size_t val)
A power of 2 that is greater than or equal to val.
Definition: pow2.h:46
constexpr int floorLog2_constexpr(size_t val)
The base-2 logarithm of val.
Definition: pow2.h:31
constexpr bool isPow2(size_t val)
Return true if and only if val is a power of 2.
Definition: pow2.h:8
Definition: testrt.h:9