自始至终,我都会多次说
u16
和u32
。这应该被理解为 uX
的代表,u2X
代表任何整数 X(例如 u8
和 u16
、u16
和 u32
、u32
和 u64
、u64
)和u128
)。
如果
x
、y
是整数(比如u16
),它们的乘积x*y
自然是u32
z
,可以写成z = z0 + (z1 << 16)
。如果只想计算 z0
,可以使用 u16::wrapping_mul
轻松完成。如果你only想计算z1
,有这样的命令吗?我特别希望 high_mul
命令具有类型 fn high_mul(x: u16, y: u16) -> u16
。当然,自己编写这样的命令非常容易 --- 我最感兴趣的是 Rust 编译器将降低到某些嵌入式设备上存在的适当 mulhi
命令的命令(我没有特定的命令)牢记目标,但我听说这是一个非常常见的指令)。
我也对使用少量包装
u16
muls 来计算此类命令的方法感兴趣。使用 Karatsuba 乘法的变体实现 3 似乎很简单(这需要某些额外的加法和掩码,我对此很满意),所以我最感兴趣的是使用 2 u16::wrapping_mul
或(理想情况下)1 的实现.
u16::widening_mul
获得近似解决方案,它返回低位和高位的 (u16, u16)
元组。如果您需要稳定,当前实现只会提升到下一个最高整数类型,并在乘法后分为高半部分和低半部分。
您应该自己编译并查看是否执行相同的操作并丢弃低位可以在目标系统上优化为
mulhi
。