其中 LSB 位于索引 0,MSB 位于索引 63。类似地,它应该扩展到 u32 和其他类型。
let my_num: u64 = 100; // 0b1100100
let msb = get_msb(my_num); // 0
let lsb = get_lsb(my_num); // 0
Run Code Online (Sandbox Code Playgroud)
更正:MSB 在第 63 位应为 0,而不是在索引 6 处为 1
正如评论中所解释的,您可以分别获得 和u64的LSB 和 MSB 。n & 1(n >> 63) & 1
然而,在 Rust 中完全通用地做到这一点有点麻烦,因为泛型需要像移位、屏蔽甚至构造这样的操作1来预先完全指定。然而,这就是num-traits板条箱可以拯救的地方。与它的表兄弟一起num,它是数字领域通用 Rust 的事实上的标准,提供了(除其他外)使PrimInt和get_msb()简单的特征get_lsb():
use num_traits::PrimInt;
pub fn get_lsb<N: PrimInt>(n: N) -> N {
n & N::one()
}
pub fn get_msb<N: PrimInt>(n: N) -> N {
let shift = std::mem::size_of::<N>() * 8 - 1;
(n >> shift) & N::one()
}
fn main() {
assert_eq!(get_lsb(100u32), 0);
assert_eq!(get_lsb(101u32), 1);
assert_eq!(get_msb(100u32), 0);
assert_eq!(get_msb(u32::MAX), 1);
}
Run Code Online (Sandbox Code Playgroud)
1如果您对仅使用标准库的完整版本感到好奇,它的外观如下:
use std::convert::TryFrom;
use std::ops::{BitAnd, Shr};
fn one<N: TryFrom<u8>>() -> N {
1u8.try_into().unwrap_or_else(|_| unreachable!())
}
pub fn get_lsb<N>(n: N) -> N
where
N: BitAnd<Output = N> + TryFrom<u8>,
{
n & one()
}
pub fn get_msb<N>(n: N) -> N
where
N: Shr<usize, Output = N> + BitAnd<Output = N> + TryFrom<u8>,
{
let shift = std::mem::size_of::<N>() * 8 - 1;
(n >> shift) & one()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3410 次 |
| 最近记录: |