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}