1pub fn previous_po2(number: usize) -> usize {
2 return 1 << (usize::BITS as usize - number.leading_zeros() as usize - 1);
3}
4
5pub trait PowersOf2 {
7 fn powerOf2(self) -> bool;
8 fn nextPowerOf2(self) -> usize;
9 fn log2(self) -> u8;
10}
11
12impl PowersOf2 for usize {
13 fn powerOf2(self) -> bool {
16 self != 0 && (self & (self - 1)) == 0
17 }
18
19 fn nextPowerOf2(self) -> usize {
24 if self == 0 {
27 return 1;
28 }
29
30 let mut v = Wrapping(self);
31
32 v = v - Wrapping(1);
33 v = v | (v >> 1);
34 v = v | (v >> 2);
35 v = v | (v >> 4);
36 v = v | (v >> 8);
37 v = v | (v >> 16);
38 if size_of::<usize>() > 4 {
39 v = v | (v >> 32);
40 }
41 v = v + Wrapping(1);
42
43 let result = match v {
44 Wrapping(v) => v,
45 };
46 assert!(result.powerOf2());
47 assert!(result >= self && self > result >> 1);
48 result
49 }
50
51 fn log2(self) -> u8 {
59 let mut temp = self;
60 let mut result = 0;
61 temp >>= 1;
62 while temp != 0 {
63 result += 1;
64 temp >>= 1;
65 }
66 result
67 }
68}
69
70use core::{mem::size_of, num::Wrapping};