Description
Filing since it's in pFCP over at #70887 (comment), and I don't think we can reasonably change it after stabilization (especially since it's documented).
Currently, 0.ilog2()
in release mode evaluates to 0
. (And same for the other bases.)
It's not obvious to me that that's necessarily the best option. For example, the (BITS-1) - LeadingZeros
implementation is slightly nicer on CPUs from the past decade or so https://rust.godbolt.org/z/3q6WME84Y (and I think would be just as nice on older ones if LLVM was a bit smarter), but gives -1
as u32 in the wrapping case.
It also might be nice to have the wrapping case give something clearly different from any of the successful cases, rather than having 1.ilog2()
and 0.ilog2()
give the same thing. For example u32::MAX.next_power_of_two()
returns 0
in release mode, which isn't a power of two (according to is_power_of_two
), so it's distinguishable from all the non-wrapping cases.
This only affects ilog
/ilog2
/ilog10
on uNN
. (The checked versions don't have an issue, nor do the ones on NonZeroUNN
.)