barretenberg
Loading...
Searching...
No Matches
count_leading_zeros.hpp
1#pragma once
2#include "../uint128/uint128.hpp"
3#include "../uint256/uint256.hpp"
4#include <cstdint>
5
6namespace numeric {
7
13template <typename T> constexpr inline size_t count_leading_zeros(T const& u);
14
15template <> constexpr inline size_t count_leading_zeros<uint32_t>(uint32_t const& u)
16{
17 return static_cast<size_t>(__builtin_clz(u));
18}
19
20template <> constexpr inline size_t count_leading_zeros<uint64_t>(uint64_t const& u)
21{
22 return static_cast<size_t>(__builtin_clzll(u));
23}
24
25template <> constexpr inline size_t count_leading_zeros<uint128_t>(uint128_t const& u)
26{
27 auto hi = static_cast<uint64_t>(u >> 64);
28 if (hi != 0U) {
29 return static_cast<size_t>(__builtin_clzll(hi));
30 }
31 auto lo = static_cast<uint64_t>(u);
32 return static_cast<size_t>(__builtin_clzll(lo)) + 64;
33}
34
35template <> constexpr inline size_t count_leading_zeros<uint256_t>(uint256_t const& u)
36{
37 if (u.data[3] != 0U) {
38 return count_leading_zeros(u.data[3]);
39 }
40 if (u.data[2] != 0U) {
41 return count_leading_zeros(u.data[2]) + 64;
42 }
43 if (u.data[1] != 0U) {
44 return count_leading_zeros(u.data[1]) + 128;
45 }
46 if (u.data[0] != 0U) {
47 return count_leading_zeros(u.data[0]) + 192;
48 }
49 return 256;
50}
51
52} // namespace numeric
Definition: uint256.hpp:25
Definition: field2_declarations.hpp:6
constexpr size_t count_leading_zeros(T const &u)