IPv4 地址本質是 32 位無符號整數,常以點分十進制(如 192.168.1.1)呈現。在數據庫存儲、網絡比對、範圍查詢等場景,將其轉為 long 型整數可大幅提升性能與便利性。本文從位運算原理出發,提供兩種高效實現並分析細節。
IPv4 四段各佔 8 位(0-255),組合為 32 位:
IP = (段1 << 24) | (段2 << 16) | (段3 << 8) | 段4
x << n == x * 2^n)。>>>>:高位補 0,關鍵處理 Java 無無符號類型問題。& 掩碼:提取特定 8 位(0xFF = 255)。public static long ipToLong(String ipStr) {
String[] parts = ipStr.split("\\.");
long result = 0;
for (int i = 0; i < 4; i++) {
result = (result << 8) + Long.parseLong(parts[i]);
}
return result;
}
public static long ipToLong(String ip) {
String[] items = ip.split("\\.");
return (Long.parseLong(items[0]) << 24)
| (Long.parseLong(items[1]) << 16)
| (Long.parseLong(items[2]) << 8)
| Long.parseLong(items[3]);
}
注意:split("\\.") 需轉義點號;輸入應預校驗格式。
public static String longToIp(long ipLong) {
StringBuilder sb = new StringBuilder();
sb.append((ipLong >>> 24) & 0xFF).append('.');
sb.append((ipLong >>> 16) & 0xFF).append('.');
sb.append((ipLong >>> 8) & 0xFF).append('.');
sb.append(ipLong & 0xFF);
return sb.toString();
}
>>> 24 取最高 8 位,& 0xFF 確保無符號。public class IpConverter {
public static void main(String[] args) {
String ip = "202.112.96.163";
long num = ipToLong(ip);
String back = longToIp(num);
System.out.println("原始 IP: " + ip);
System.out.println("十進制: " + num); // 3396362403
System.out.println("二進制: " + Long.toBinaryString(num));
System.out.println("反轉 IP: " + back); // 202.112.96.163
}
// 此處放上述兩個 static 方法
}
long 有號,超過 2^31-1 會顯示負數,但位模式正確,存儲/計算無影響。BigInteger 或 byte[16]。InetAddress.getByName(ip).getAddress() 取 byte[] 再移位,避免字符串分割開銷。INET_ATON()/INET_NTOA();PostgreSQL 用 inet 類型原生支援。