checked_ilog: improve performance
diff --git a/library/core/src/num/int_macros.rs b/library/core/src/num/int_macros.rs
index 1f43520..aed6a34 100644
--- a/library/core/src/num/int_macros.rs
+++ b/library/core/src/num/int_macros.rs
@@ -2477,18 +2477,18 @@
None
} else {
let mut n = 0;
- let mut r = self;
+ let mut r = 1;
// Optimization for 128 bit wide integers.
if Self::BITS == 128 {
let b = Self::ilog2(self) / (Self::ilog2(base) + 1);
n += b;
- r /= base.pow(b as u32);
+ r *= base.pow(b);
}
- while r >= base {
- r /= base;
+ while r <= self / base {
n += 1;
+ r *= base;
}
Some(n)
}
diff --git a/library/core/src/num/uint_macros.rs b/library/core/src/num/uint_macros.rs
index 23ca378..d7f2ad8 100644
--- a/library/core/src/num/uint_macros.rs
+++ b/library/core/src/num/uint_macros.rs
@@ -810,18 +810,18 @@
None
} else {
let mut n = 0;
- let mut r = self;
+ let mut r = 1;
// Optimization for 128 bit wide integers.
if Self::BITS == 128 {
let b = Self::ilog2(self) / (Self::ilog2(base) + 1);
n += b;
- r /= base.pow(b as u32);
+ r *= base.pow(b);
}
- while r >= base {
- r /= base;
+ while r <= self / base {
n += 1;
+ r *= base;
}
Some(n)
}