如何计算给定IPv4网络掩码的前缀长度

How to calculate prefix length for given IPv4 network mask?

本文关键字:掩码 网络 前缀 IPv4 何计算 计算      更新时间:2023-10-16

我需要计算IPv4网络掩码的前缀长度。我的第一个天真的方法是

int calculate_prefix_length (uint32_t address) {
  int set_bits;
    for (set_bits = 0; address; address >>= 1) {
      set_bits += address & 1;
    }
  return set_bits;
}

这可能不是很快。有没有更好的解决方案?

netmark通常有'n'个'1'后面跟着32 'n'个' 0 '。先数0,减去32得到1的个数。或者如果你的网络是a类的,你可以先计算"1"的数量。下面的代码对"C"类网络运行更快

int calculate_prefix_length (uint32_t address) {
   int zero_bits;
   for (zero_bits = 0; (address & 1) == 0; address >>= 1, zero_bits++);
   return (32 - zero_bits);
}

您也可以通过计算位集计数来避免分支:

    constexpr uint8_t numberOfSetBits(uint32_t i)
    {
        i = i - ((i >> 1) & 0x55555555);
        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
        i = (i + (i >> 4)) & 0x0F0F0F0F;
        return (i * 0x01010101) >> 24;
    }

参见https://stackoverflow.com/a/109025/4880243