1use super::transmute;
2
3#[inline]
4pub const fn normalize_u64(c: u64) -> [u8; 8] {
5 unsafe {
7 let [s, h, d, c]: [u16; 4] = transmute(c);
8
9 let has4 = s & h & d & c;
10 let has3 = s & h & d | s & h & c | s & d & c | h & d & c;
11
12 let has2 = s & h | s & d | s & c | h & d | h & c | d & c;
13 let has1 = s | h | d | c;
14
15 transmute([has1, has2, has3, has4])
16 }
17}
18
19const U16_D: u16 = 1 << 15;
20
21#[inline]
22pub const fn retain_leading_bit(v: u16) -> u16 {
23 if v == 0 {
24 0
25 } else {
26 U16_D >> v.leading_zeros()
27 }
28}
29
30#[inline]
31pub const fn retain_leading_2_bits(v: u16) -> u16 {
32 let mem = retain_leading_bit(v);
33
34 retain_leading_bit(v & !mem) | mem
35}
36
37#[inline]
38pub const fn retain_leading_3_bits(v: u16) -> u16 {
39 let mem = retain_leading_2_bits(v);
40
41 retain_leading_bit(v & !mem) | mem
42}
43
44#[inline]
45pub const fn retain_leading_4_bits(v: u16) -> u16 {
46 let mem = retain_leading_3_bits(v);
47
48 retain_leading_bit(v & !mem) | mem
49}
50
51#[inline]
52pub const fn retain_leading_5_bits(v: u16) -> u16 {
53 let mem = retain_leading_4_bits(v);
54
55 retain_leading_bit(v & !mem) | mem
56}