Skip to content

Commit 9ccff4a

Browse files
authored
Rollup merge of #147686 - vrtgs:non-zero-isolate, r=joboet
update isolate_highest_one for NonZero<T> ## Rationale Let `x = self` and `m = (((1 as $Int) << (<$Int>::BITS - 1)).wrapping_shr(self.leading_zeros()))` Then the previous code computed `NonZero::new_unchecked(x & m)`. Since `m` has exactly one bit set (the most significant 1-bit of `x`), `(x & m) == m`. Therefore, the masking step was redundant. The shift is safe and does not need wrapping because: * `self.leading_zeros() < $Int::BITS` because `self` is non-zero. * The result of `unchecked_shr` is non-zero, satisfying the `NonZero` invariant. if wrapping happens we would be violating `NonZero` invariants. why this micro optimization? the old code was suboptimal it duplicated `$Int`’s isolate_highest_one logic instead of delegating to it. Since the type already wraps `$Int`, either delegation should be used for clarity or, if keeping a custom implementation, it should be optimized as above.
2 parents da2e3aa + 057127c commit 9ccff4a

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

library/core/src/num/nonzero.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -660,12 +660,15 @@ macro_rules! nonzero_integer {
660660
without modifying the original"]
661661
#[inline(always)]
662662
pub const fn isolate_highest_one(self) -> Self {
663-
let n = self.get() & (((1 as $Int) << (<$Int>::BITS - 1)).wrapping_shr(self.leading_zeros()));
664-
665663
// SAFETY:
666664
// `self` is non-zero, so masking to preserve only the most
667665
// significant set bit will result in a non-zero `n`.
668-
unsafe { NonZero::new_unchecked(n) }
666+
// and self.leading_zeros() is always < $INT::BITS since
667+
// at least one of the bits in the number is not zero
668+
unsafe {
669+
let bit = (((1 as $Uint) << (<$Uint>::BITS - 1)).unchecked_shr(self.leading_zeros()));
670+
NonZero::new_unchecked(bit as $Int)
671+
}
669672
}
670673

671674
/// Returns `self` with only the least significant bit set.

0 commit comments

Comments
 (0)