Вот более математический подход, избегая строк любой ценой:
def cidr_mask
Integer(32-Math.log2((IPAddr.new(mask,Socket::AF_INET).to_i^0xffffffff)+1))
end
с маской, представляющей собой строку типа 255.255.255.0. Вы можете изменить его и изменить первый аргумент на «маску», если «маска» уже является целочисленным представлением IP-адреса.
Так, например, если маска была "255.255.255.0", IPAddr.new (mask, Socket :: AF_INET) .to_i станет 0xffffff00, который затем будет xor'd с 0xffffffff, что равно 255.
Мы добавляем 1 к этому, чтобы сделать его полным диапазоном из 256 хостов, затем находим лог-базу 2 из 256, что равно 8 (биты, используемые для адреса хоста), затем вычитаем это 8 из 32, что равно 24 (биты, используемые для сетевого адреса).
Затем мы приводим к целому числу, потому что Math.log2 возвращает число с плавающей запятой.