[英]Rust bitwise operations
我目前正在嘗試將 rust(作為 u16)中的十六進制值轉換為存儲為單獨變量的 RGB 值,所有類型均為 u8。 我決定這樣做的方法是使用按位運算符通過以下代碼從十六進制中獲取單獨的值:
Color::RGB(((hex >> (16u8)) & 0xFF) as u8, ((hex >> (8u8)) & 0xFF) as u8, ((hex) & 0xFF) as u8)
這導致了一個錯誤:
error: this arithmetic operation will overflow
--> src/style.rs:50:21
|
50 | Color::RGB(((hex >> (16u8)) & 0xFF) as u8, ((hex >> (8u8)) & 0xFF) as u8, ((hex) & 0xFF) as u8)
| ^^^^^^^^^^^^^^^ attempt to shift right by `16_u8`, which would overflow
|
= note: `#[deny(arithmetic_overflow)]` on by default
error: aborting due to previous error; 3 warnings emitted
我已經通過使用 u16 的checked_shr(u16)
解決了這個問題,但是這使得我的代碼比我想象的要復雜得多,其中:
let mut r: u8 = 0;
let mut g: u8 = 0;
let mut b: u8 = (hex as u8) & 0xFF;
if let Some(h16) = hex.checked_shr(16) {
r = (h16 as u8) & 0xFF;
}
if let Some(h8) = hex.checked_shr(8) {
g = (h8 as u8) & 0xFF;
}
Color::RGB(r, g, b)
我想知道是否有更好的方法來解決錯誤,如果我只是在原始代碼中犯了錯誤,和/或是否有更好的方法來做到這一點? 我還試圖避免關閉#[deny(arithmetic_overflow)]
,但這可能是一個錯誤。 感謝您的時間!
通過將十六進制值從 u16 更改為 u32 解決了問題,感謝 matt 和 Mihir 指出這一點!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.