You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 17:03:13