src/main/java/org/firepick/IPv4Scanner.java
public static InetAddress subnetAddress0(InetAddress addr, int subnetBits) {
    if (subnetBits < 1 || 32 <= subnetBits) {
      throw new FireRESTException("Expected subnetBits 1..31");
    }
    long mask = 1;
    for (int i = 0; i < 32; i++) {
      mask <<= 1;
      mask |= i < subnetBits ? 1 : 0;
    }
    long host0 = asLongAddress(addr) & mask;
    try {
      return asInetAddress(host0);
    } catch (UnknownHostException e) {
      throw new FireRESTException(e);
    }
  }
public static InetAddress subnetAddress0(InetAddress addr, int subnetBits) {
    if (subnetBits < 1 || 32 <= subnetBits) {
      throw new FireRESTException("Expected subnetBits 1..31");
    }
    long mask = 1;
    for (int i = 0; i < 32; i++) {
      mask <<= 1;
      mask |= i < subnetBits ? 1 : 0;
    }
    long host0 = asLongAddress(addr) & mask;
    try {
      return asInetAddress(host0);
    } catch (UnknownHostException e) {
      throw new FireRESTException(e);
    }
  }
Return first address on subnet containing given address

@param addr any machine in subnet
@param subnetBits the number of bits in subnet mask. Many small networks use 24.
@return first address on subnet. E.g., subnetAddress(10.0.1.88, 25) -> 10.0.1.0