Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
count_leading_zeros.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
8#include "../uint128/uint128.hpp"
9#include "../uint256/uint256.hpp"
10#include <cstdint>
11
12namespace bb::numeric {
13
19template <typename T> constexpr inline size_t count_leading_zeros(T const& u);
20
21template <> constexpr inline size_t count_leading_zeros<uint32_t>(uint32_t const& u)
22{
23 return static_cast<size_t>(__builtin_clz(u));
24}
25
26template <> constexpr inline size_t count_leading_zeros<uint64_t>(uint64_t const& u)
27{
28 return static_cast<size_t>(__builtin_clzll(u));
29}
30
31template <> constexpr inline size_t count_leading_zeros<uint128_t>(uint128_t const& u)
32{
33 auto hi = static_cast<uint64_t>(u >> 64);
34 if (hi != 0U) {
35 return static_cast<size_t>(__builtin_clzll(hi));
36 }
37 auto lo = static_cast<uint64_t>(u);
38 return static_cast<size_t>(__builtin_clzll(lo)) + 64;
39}
40
41template <> constexpr inline size_t count_leading_zeros<uint256_t>(uint256_t const& u)
42{
43 if (u.data[3] != 0U) {
44 return count_leading_zeros(u.data[3]);
45 }
46 if (u.data[2] != 0U) {
47 return count_leading_zeros(u.data[2]) + 64;
48 }
49 if (u.data[1] != 0U) {
50 return count_leading_zeros(u.data[1]) + 128;
51 }
52 if (u.data[0] != 0U) {
53 return count_leading_zeros(u.data[0]) + 192;
54 }
55 return 256;
56}
57
58} // namespace bb::numeric
constexpr size_t count_leading_zeros< uint64_t >(uint64_t const &u)
constexpr size_t count_leading_zeros< uint256_t >(uint256_t const &u)
constexpr size_t count_leading_zeros(T const &u)
constexpr size_t count_leading_zeros< uint32_t >(uint32_t const &u)
constexpr size_t count_leading_zeros< uint128_t >(uint128_t const &u)
unsigned __int128 uint128_t
Definition serialize.hpp:44