如何计算给定IPv4网络掩码的前缀长度
How to calculate prefix length for given IPv4 network mask?
我需要计算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
相关文章:
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- 使用二进制掩码 C++ ITK 获取感兴趣区域
- C++中的运行时位复制(位掩码)
- 根据 IP 和掩码C++打印所有 IP
- C++设置"blank"或重置 ifstrean (ios) 的异常掩码
- OpenCV 检测带有掩码的斑点
- OPENCV:如何创建多边形形状的掩码
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 如何计算给定IPv4网络掩码的前缀长度