gate_calc_log_bits/
lib.rs

1//! Simple library that provide numeric utility used in Gate Project.
2
3// calculate ceil(log(N)): 2 -> 1, 3 -> 2, 5 -> 3, 8 -> 3.
4
5/// Calculate `ceil(log(N))`. It return system sized unsigned result.
6///
7/// Calculate `ceil(log(N))`. Example: calc_log_bits(4)=4, calc_log_bits(5)=3.
8/// If supplied 0 then it returns 0.
9pub const fn calc_log_bits(n: usize) -> usize {
10    if n == 0 {
11        return 0;
12    }
13    let nbits = usize::BITS - n.leading_zeros();
14    if (1 << (nbits - 1)) == n {
15        (nbits - 1) as usize
16    } else {
17        nbits as usize
18    }
19}
20
21/// Calculate `ceil(log(N))`. It return 32-bit unsigned result.
22///
23/// Calculate `ceil(log(N))`. Example: calc_log_bits(4)=4, calc_log_bits(5)=3.
24/// If supplied 0 then it returns 0.
25pub const fn calc_log_bits_u32(n: u32) -> u32 {
26    if n == 0 {
27        return 0;
28    }
29    let nbits = u32::BITS - n.leading_zeros();
30    if (1 << (nbits - 1)) == n {
31        nbits - 1
32    } else {
33        nbits
34    }
35}
36
37/// Calculate `ceil(log(N))`. It return system sized unsigned result.
38///
39/// Calculate `ceil(log(N))`. Example: calc_log_bits(4)=4, calc_log_bits(5)=3.
40/// If supplied 0 then it returns 0.
41pub const fn calc_log_bits_u64(n: u64) -> usize {
42    if n == 0 {
43        return 0;
44    }
45    let nbits = u64::BITS - n.leading_zeros();
46    if (1 << (nbits - 1)) == n {
47        (nbits - 1) as usize
48    } else {
49        nbits as usize
50    }
51}
52
53/// Calculate `ceil(log(N))`. It return system sized unsigned result.
54///
55/// Calculate `ceil(log(N))`. Example: calc_log_bits(4)=4, calc_log_bits(5)=3.
56/// If supplied 0 then it returns 0.
57pub const fn calc_log_bits_u128(n: u128) -> usize {
58    if n == 0 {
59        return 0;
60    }
61    let nbits = u128::BITS - n.leading_zeros();
62    if (1 << (nbits - 1)) == n {
63        (nbits - 1) as usize
64    } else {
65        nbits as usize
66    }
67}