Skip to content

Commit bf87868

Browse files
authored
Merge pull request #1778 from evoskuil/master
Add is_power2(), test.
2 parents 4a990f5 + 3bd94fd commit bf87868

3 files changed

Lines changed: 95 additions & 0 deletions

File tree

include/bitcoin/system/impl/math/logarithm.ipp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ constexpr Exponent floored_log_(Base base, Value value) NOEXCEPT
8282
}
8383
}
8484

85+
// published (bool)
86+
// ----------------------------------------------------------------------------
87+
88+
template <typename Value,
89+
if_integral_integer<Value>>
90+
constexpr bool is_power2(Value value) NOEXCEPT
91+
{
92+
return !is_zero(value) && std::has_single_bit(value);
93+
}
94+
8595
// published (ceilinged)
8696
// ----------------------------------------------------------------------------
8797

include/bitcoin/system/math/logarithm.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@
3131
namespace libbitcoin {
3232
namespace system {
3333

34+
/// True if one bit is set, false if zero of more than one bit set.
35+
template <typename Value,
36+
if_integral_integer<Value> = true>
37+
constexpr bool is_power2(Value value) NOEXCEPT;
38+
3439
/// Ceilinged logarithms.
3540
/// Obtain the ceilinged (rounded up) integer logarithm of given value and base.
3641
/// Returns 0 for undefined (base < 2 or value < 1).

test/math/logarithm.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,86 @@
1818
*/
1919
#include "../test.hpp"
2020

21+
// is_power2
22+
23+
////static_assert(!is_power2(-1));
24+
static_assert(!is_power2(0u));
25+
static_assert(!is_power2(3u));
26+
static_assert(!is_power2(5u));
27+
static_assert(!is_power2(6u));
28+
static_assert(!is_power2(7u));
29+
static_assert(!is_power2(9u));
30+
static_assert(!is_power2(10u));
31+
static_assert(!is_power2(11u));
32+
static_assert(!is_power2(12u));
33+
static_assert(!is_power2(sub1(9223372036854775808u)));
34+
static_assert(!is_power2(add1(9223372036854775808u)));
35+
36+
static_assert( is_power2(1u));
37+
static_assert( is_power2(2u));
38+
static_assert( is_power2(4u));
39+
static_assert( is_power2(8u));
40+
static_assert( is_power2(16u));
41+
static_assert( is_power2(32u));
42+
static_assert( is_power2(64u));
43+
static_assert( is_power2(128u));
44+
static_assert( is_power2(256u));
45+
static_assert( is_power2(512u));
46+
static_assert( is_power2(1024u));
47+
static_assert( is_power2(2048u));
48+
static_assert( is_power2(4096u));
49+
static_assert( is_power2(8192u));
50+
static_assert( is_power2(16384u));
51+
static_assert( is_power2(32768u));
52+
static_assert( is_power2(65536u));
53+
static_assert( is_power2(131072u));
54+
static_assert( is_power2(262144u));
55+
static_assert( is_power2(524288u));
56+
static_assert( is_power2(1048576u));
57+
static_assert( is_power2(2097152u));
58+
static_assert( is_power2(4194304u));
59+
static_assert( is_power2(8388608u));
60+
static_assert( is_power2(16777216u));
61+
static_assert( is_power2(33554432u));
62+
static_assert( is_power2(67108864u));
63+
static_assert( is_power2(134217728u));
64+
static_assert( is_power2(268435456u));
65+
static_assert( is_power2(536870912u));
66+
static_assert( is_power2(1073741824u));
67+
static_assert( is_power2(2147483648u));
68+
static_assert( is_power2(4294967296u));
69+
static_assert( is_power2(8589934592u));
70+
static_assert( is_power2(17179869184u));
71+
static_assert( is_power2(34359738368u));
72+
static_assert( is_power2(68719476736u));
73+
static_assert( is_power2(137438953472u));
74+
static_assert( is_power2(274877906944u));
75+
static_assert( is_power2(549755813888u));
76+
static_assert( is_power2(1099511627776u));
77+
static_assert( is_power2(2199023255552u));
78+
static_assert( is_power2(4398046511104u));
79+
static_assert( is_power2(8796093022208u));
80+
static_assert( is_power2(17592186044416u));
81+
static_assert( is_power2(35184372088832u));
82+
static_assert( is_power2(70368744177664u));
83+
static_assert( is_power2(140737488355328u));
84+
static_assert( is_power2(281474976710656u));
85+
static_assert( is_power2(562949953421312u));
86+
static_assert( is_power2(1125899906842624u));
87+
static_assert( is_power2(2251799813685248u));
88+
static_assert( is_power2(4503599627370496u));
89+
static_assert( is_power2(9007199254740992u));
90+
static_assert( is_power2(18014398509481984u));
91+
static_assert( is_power2(36028797018963968u));
92+
static_assert( is_power2(72057594037927936u));
93+
static_assert( is_power2(144115188075855872u));
94+
static_assert( is_power2(288230376151711744u));
95+
static_assert( is_power2(576460752303423488u));
96+
static_assert( is_power2(1152921504606846976u));
97+
static_assert( is_power2(2305843009213693952u));
98+
static_assert( is_power2(4611686018427387904u));
99+
static_assert( is_power2(9223372036854775808u));
100+
21101
// ceilinged_log
22102

23103
static_assert(ceilinged_log(-2, 2u) == 0u);

0 commit comments

Comments
 (0)