将位数转换为 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);
我需要将位数从 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);