Маска подсети определяет, какая часть IP-адреса является сетевым IP-адресом, а какая - IP-адресом устройства, выполняя побитовое И между маской и IP-адресом, чтобы получить сетевой IP-адрес. Например:
192.168.3.45 -> 11000000.10101000.00000011.00101101
255.255.255.240 -> 11111111.11111111.11111111.11110000
Network IP -> 11000000.10101000.00000011.00100000 <- because the last 4 digits of the subnet mask were 0 here, the resulting network IP bits are also 0.
Host IP -> 00000000.00000000.00000000.00001101
Так как в приведенном выше примере последние 4 цифры определяют IP-адрес хоста, у вас должно быть 2 ^ 4 доступных IP-адреса, но на самом деле у вас есть 2 ^ 4 - 2, потому что адреса, где все биты хоста равны 1 или 0 являются особыми и не могут использоваться для определенных устройств.
Чтобы узнать, сколько IP-адресов хостов может поддерживать сеть, вы можете просто инвертировать значения маски подсети и превратить ее в int:
int result = 0;
for (int i = 0; i < bSB.length; i++) {
result <<= 8; // Bit shift 8 digits to the left.
result |= ~bSB[i]; // Perform bitwise or-equals with the bitwise inverted value of bSB[i]
}
result <<= 8;
result -= 2; // Special IPs
Полученное целое число - количество возможных IP-адресов хоста.