Skip to content

Commit 1aa4e6d

Browse files
authored
optimize used_bits_safe (#8)
1 parent 0295149 commit 1aa4e6d

File tree

1 file changed

+26
-39
lines changed

1 file changed

+26
-39
lines changed

src/common/arithmetic.rs

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -87,27 +87,12 @@ pub fn signed_to_unsigned(a: i16) -> u16 {
8787
}
8888

8989
#[inline(always)]
90-
pub fn used_bits_safe(n: u64) -> usize {
90+
pub const fn used_bits_safe(n: u64) -> usize {
9191
if n == 0 {
92-
return 0;
92+
0
93+
} else {
94+
(64 - (n - 1).leading_zeros()) as usize
9395
}
94-
95-
used_bits(n - 1) as usize
96-
}
97-
98-
#[inline(always)]
99-
pub fn used_bits(n: u64) -> u64 {
100-
if n == 0 {
101-
return 0;
102-
}
103-
104-
msb(n) as u64 + 1
105-
}
106-
107-
#[inline(always)]
108-
pub fn msb(n: u64) -> u32 {
109-
debug_assert!(n != 0);
110-
63 ^ n.leading_zeros()
11196
}
11297

11398
#[cfg(test)]
@@ -124,26 +109,6 @@ mod tests {
124109
assert_eq!(nth_set_bit_index(test_value, 4), 7);
125110
}
126111

127-
#[test]
128-
fn test_msb() {
129-
assert_eq!(msb(12), 3);
130-
}
131-
132-
#[test]
133-
fn test_used_bits() {
134-
assert_eq!(used_bits(12), 4);
135-
}
136-
137-
#[test]
138-
fn test_used_bits_safe() {
139-
assert_eq!(used_bits_safe(12), 4);
140-
}
141-
142-
#[test]
143-
fn test_used_bits_safe_zero() {
144-
assert_eq!(used_bits_safe(0), 0);
145-
}
146-
147112
#[test]
148113
fn test_unsigned_to_signed() {
149114
assert_eq!(unsigned_to_signed(65409), -32705);
@@ -173,4 +138,26 @@ mod tests {
173138
fn test_unsigned_to_signed_three() {
174139
assert_eq!(unsigned_to_signed(3), -2);
175140
}
141+
142+
#[test]
143+
fn test_used_bits_safe() {
144+
assert_eq!(used_bits_safe(0), 0);
145+
assert_eq!(used_bits_safe(1), 0);
146+
assert_eq!(used_bits_safe(12), 4);
147+
148+
assert_eq!(used_bits_safe(2), 1);
149+
assert_eq!(used_bits_safe(4), 2);
150+
assert_eq!(used_bits_safe(8), 3);
151+
assert_eq!(used_bits_safe(1024), 10);
152+
153+
assert_eq!(used_bits_safe(3), 2);
154+
assert_eq!(used_bits_safe(7), 3);
155+
assert_eq!(used_bits_safe(255), 8);
156+
157+
assert_eq!(used_bits_safe(10), 4);
158+
assert_eq!(used_bits_safe(100), 7);
159+
assert_eq!(used_bits_safe(12345), 14);
160+
161+
assert_eq!(used_bits_safe(u64::MAX), 64);
162+
}
176163
}

0 commit comments

Comments
 (0)