如何在 Rust 中找到无符号数 u64 的最高和最低有效位?
How to find most and least significant bits of an unsigned number u64 in Rust?
其中 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
更正:MSB 在第 63 位应为 0,而不是在索引 6 处为 1
正如评论中所解释的,您可以分别使用 n & 1
和 (n >> 63) & 1
获得 u64
的 LSB 和 MSB。
不过,在 Rust 中完全泛型地完成它有点麻烦,因为泛型需要像移位、掩码,甚至 1
的构造这样的操作,以便预先完全指定。然而,这就是 num-traits
crate comes to the rescue. Along with its cousin 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);
}
其中 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
更正:MSB 在第 63 位应为 0,而不是在索引 6 处为 1
正如评论中所解释的,您可以分别使用 n & 1
和 (n >> 63) & 1
获得 u64
的 LSB 和 MSB。
不过,在 Rust 中完全泛型地完成它有点麻烦,因为泛型需要像移位、掩码,甚至 1
的构造这样的操作,以便预先完全指定。然而,这就是 num-traits
crate comes to the rescue. Along with its cousin 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);
}