我正在Rust中编写一个有效的平方方法。我们假设Mul
的{{1}}特征是一个黑盒子,我们只允许安全,惯用的Rust。
下面是第一遍,它使用重复平方来获得更大的指数。我不确定LLVM将如何转换Rust算术方法调用,例如AbstractNumber
。
以下内容是否合理?将小案例分支拆分为自己的内联函数会更有效吗?
checked_next_power_of_two()
答案 0 :(得分:3)
为什么不使用num::pow::pow?无论如何,这是如何实现的:
#[inline]
pub fn pow<T: Clone + One + Mul<T, Output = T>>(mut base: T, mut exp: usize) -> T {
if exp == 0 { return T::one() }
while exp & 1 == 0 {
base = base.clone() * base;
exp >>= 1;
}
if exp == 1 { return base }
let mut acc = base.clone();
while exp > 1 {
exp >>= 1;
base = base.clone() * base;
if exp & 1 == 1 {
acc = acc * base.clone();
}
}
acc
}
除了Clone
(和Mul
之外,它还需要One
,但如果您不是通用的,则不需要{。}}。
顺便说一句,在Rust中使用按位运算没有任何错误或不安全。