Rust中获取商和余数的DIVMOD相关实现方法是什么?
问题
x86以及绝大多数常见架构都支持通过单条DIV指令同时计算出除法的商和余数,因此很多编程语言都提供了DIVMOD组合操作,比如C#中的DIVREM、Python中的DIVMOD,还有C语言中的div和div_t。请问在Rust中如何实现相同的功能?
是否存在优化方法可以同时执行如下操作:
let res = (a / b, a % b);
解答
Rust 1.73及以上版本的标准库原生方案
标准库已经为所有基础整数类型(i8/u8/i32/u32/i64/u64/isize/usize等)内置了div_rem方法,直接返回商和余数组成的元组,语义清晰,编译器会直接生成最优的单指令实现,不需要额外优化:let a = 10i32; let b = 3; let (quotient, remainder) = a.div_rem(b); // 结果为 quotient = 3,remainder = 1,和手动计算a/b、a%b的规则完全一致如果你需要欧几里得除法规则(商向负无穷取整,余数始终为非负数),可以调用同版本新增的
div_rem_euclid方法。旧版本Rust的方案
如果你使用的是1.73以下的旧版本Rust,也不需要手动做特殊优化:你给出的(a / b, a % b)写法在开启编译器优化(release模式默认开启)时,LLVM后端会自动识别这种同时计算商和余数的模式,合并为单条DIV指令执行,性能和专用的divmod接口没有任何差异。
如果想要更清晰的语义,也可以引入第三方数值库num,使用其中的DivRemtrait,引入后所有数值类型都可以直接调用div_rem方法。
所有上述方法的行为都和Rust原生的除法、取余规则一致,除数为0时会触发panic,溢出场景的处理也遵循Rust的默认配置。
内容的提问来源于stack exchange,提问作者Evan Carroll
相关产品推荐
相关产品推荐

