将位数转换为 32 位整数

Convert the number of bits to the 32-bits integer

我需要将位数从 CIDR 表示法转换为实际的子网掩码。例如 192.168.0.1/30。这是 30 - 在网络掩码中设置的位数(在本例中 - 255.255.255.252)。我通过将位数转换为实际字符串然后使用 u32::from_str_radix 方法来获取实际数字(我可以将其用于 Ipv4Addr 结构,因为它实现了 From<u32> 特性) .这是代码:

let bit_length = 30
let bits = format!("{:0<32}", "1".repeat(bit_length as usize));
net_mask = IpAddr::V4(u32::from_str_radix(bits.as_str().into(), 2)?.into());

我想知道在我们知道目标数字的大小时(本例中为 32 位)的情况下,是否有另一种可能更优雅的方法将位数转换为整数?也许有一些我不知道的魔法?

如果你想要前30位是1,那意味着最后2位应该是0。所以,我们可以通过取0的按位非0,然后左移得到一个每一位都为1的数两位组成两个 0。

let bit_length = 30;
let bits: u32 = (!0) << (32 - bit_length);
let net_mask = IpAddr::V4(bits.into());
println!("{:?}", net_mask);

Playground link