我需要计算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