@@ -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