【问题标题】:Convert the number of bits to the 32-bits integer将位数转换为 32 位整数
【发布时间】:2020-12-16 01:17:01
【问题描述】:

我需要将位数从 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 位)时,是否有另一种可能更优雅的方法将位数转换为整数?也许有些我不知道的魔法?

【问题讨论】:

    标签: rust type-conversion bit


    【解决方案1】:

    如果您希望前 30 位为 1,则意味着后 2 位应为 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

    【讨论】:

    • 这正是我所需要的,非常感谢@Aplet123!
    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 2019-05-30
    • 2019-08-17
    • 2017-08-06
    • 2013-05-07
    • 2018-08-17
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多