gpt4 book ai didi

rust - 在 Rust 中左移 (<<) 时如何惯用地测试溢出?

转载 作者:行者123 更新时间:2023-12-03 11:23:53 25 4
gpt4 key购买 nike

对于大多数可能溢出的操作符,Rust 提供了一个检查版本。例如,要测试加法是否溢出,可以使用 checked_add :

match 255u8.checked_add(1) {
Some(_) => println!("no overflow"),
None => println!("overflow!"),
}
这打印 "overflow!" .还有一个 checked_shl ,但根据 the documentation它只检查移位是否大于或等于 self 中的位数.这意味着虽然这个:
match 255u8.checked_shl(8) {
Some(val) => println!("{}", val),
None => println!("overflow!"),
}
被捕获并打印 "overflow!" , 这个:
match 255u8.checked_shl(7) {
Some(val) => println!("{}", val),
None => println!("overflow!"),
}
只需打印 128 ,显然没有 catch 溢出。
向左移动时检查任何类型溢出的正确方法是什么?

最佳答案

我不知道这样做的任何惯用方法,但是像实现自己的特征这样的方法会起作用:Playground
该算法基本上是检查数字中的前导零是否少于移位大小

#![feature(bool_to_option)]

trait LossCheckedShift {
fn loss_checked_shl(self, rhs: u32) -> Option<Self>
where Self: std::marker::Sized;
}

impl LossCheckedShift for u8 {
fn loss_checked_shl(self, rhs: u32) -> Option<Self> {
(rhs <= self.leading_zeros()).then_some(self << rhs)
// in stable Rust
// if rhs <= self.leading_zeros() { Some(self << rhs) }
// else { None }
}
}

fn main() {
match 255u8.loss_checked_shl(7) {
Some(val) => println!("{}", val),
None => println!("overflow!"), // <--
}

match 127u8.loss_checked_shl(1) {
Some(val) => println!("{}", val), // <--
None => println!("overflow!"),
}
match 127u8.loss_checked_shl(2) {
Some(val) => println!("{}", val),
None => println!("overflow!"), // <--
}
}

关于rust - 在 Rust 中左移 (<<) 时如何惯用地测试溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63537638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com