Rust 中有“高乘法”运算吗?

问题描述 投票:0回答:1

自始至终,我都会多次说

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 的实现.

rust embedded
1个回答
0
投票

每晚可通过

u16::widening_mul
获得近似解决方案,它返回低位和高位的
(u16, u16)
元组。如果您需要稳定,当前实现只会提升到下一个最高整数类型,并在乘法后分为高半部分和低半部分。

您应该自己编译并查看是否执行相同的操作并丢弃低位可以在目标系统上优化为

mulhi

© www.soinside.com 2019 - 2024. All rights reserved.