Rust中是否存在`high_mul`高位乘法操作及高效实现方式?
无符号整数乘法高位计算方案
下文提及的
u16和u32可作为任意整数类型uX和u2X的代称(例如u8与u16、u16与u32等)。
针对你提出的核心问题,解决方案如下:
1. 编译为mulhi指令的Rust实现
要实现fn high_mul(x: u16, y: u16) -> u16并让Rust编译器生成嵌入式设备常见的mulhi指令,最简洁的安全代码实现如下:
fn high_mul(x: u16, y: u16) -> u16 { ((x as u32) * (y as u32) >> 16) as u16 }
对于支持mulhi的目标架构(如ARM、RISC-V),LLVM后端会自动将这段代码优化为mulhi指令,无需手动编写汇编或依赖不稳定特性。如果需要强制编译器保留该逻辑,可添加#[inline(always)]属性避免过度优化。
2. 最少u16::wrapping_mul操作的实现
2次乘法实现
利用无符号整数的溢出特性,可通过以下方式仅用2次wrapping_mul计算高位:
fn high_mul_2_mul(x: u16, y: u16) -> u16 { let xy_low = x.wrapping_mul(y); let x_plus_y = x.wrapping_add(y); let xpy_sq_low = x_plus_y.wrapping_mul(x_plus_y); // 基于公式:(x+y)² = x² + 2xy + y²,推导高位 let temp = xpy_sq_low.wrapping_sub(xy_low).wrapping_sub(xy_low); (temp >> 1) as u16 }
该方案通过计算x*y的低位与(x+y)²的低位,结合无符号减法的溢出语义,推导出乘积的高位部分,仅使用2次wrapping_mul操作。
1次乘法的可行性
仅用1次u16::wrapping_mul无法得到乘积高位,因为wrapping_mul仅返回低16位结果,完全丢失了高位的信息,没有足够的中间数据来反向推导高位值,因此至少需要2次乘法操作。
内容的提问来源于stack exchange,提问作者Mark Schultz-Wu
相关产品推荐
相关产品推荐

