Java-NowCoder-判斷兩個IP是否屬於同一子網
阿新 • • 發佈:2019-02-12
題目要求:
子網掩碼是用來判斷任意兩臺計算機的IP地址是否屬於同一子網路的根據。
子網掩碼與IP地址結構相同,是32位二進位制數,其中網路號部分全為“1”和主機號部分全為“0”。利用子網掩碼可以判斷兩臺主機是否中同一子網中。若兩臺主機的IP地址分別與它們的子網掩碼相“與”後的結果相同,則說明這兩臺主機在同一子網中。
示例:
I P 地址 192.168.0.1
子網掩碼 255.255.255.0
轉化為二進位制進行運算:
I P 地址 11010000.10101000.00000000.00000001
子網掩碼 11111111.11111111.11111111.00000000
AND運算
11000000.10101000.00000000.00000000
轉化為十進位制後為:
192.168.0.0
I P 地址 192.168.0.254
子網掩碼 255.255.255.0
轉化為二進位制進行運算:
I P 地址 11010000.10101000.00000000.11111110
子網掩碼 11111111.11111111.11111111.00000000
AND運算
11000000.10101000.00000000.00000000
轉化為十進位制後為:
192.168.0.0
通過以上對兩臺計算機IP地址與子網掩碼的AND運算後,我們可以看到它運算結果是一樣的。均為192.168.0.0,所以這二臺計算機可視為是同一子網路。
/* * 功能: 判斷兩臺計算機IP地址是同一子網路。 * 輸入引數: String Mask: 子網掩碼,格式:“255.255.255.0”; * String ip1: 計算機1的IP地址,格式:“192.168.0.254”; * String ip2: 計算機2的IP地址,格式:“192.168.0.1”; * * 返回值: 0:IP1與IP2屬於同一子網路; 1:IP地址或子網掩碼格式非法; 2:IP1與IP2不屬於同一子網路 */ public int checkNetSegment(String mask, String ip1, String ip2) { /*在這裡實現功能*/ return 0; }
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String[] mask = sc.next().split("\\.");
String[] ip1 = sc.next().split("\\.");
String[] ip2 = sc.next().split("\\.");
//System.out.println(Integer.valueOf((Integer.valueOf(mask[0]) & Integer.valueOf(ip1[0]))));
for (int i = 0; i < mask.length; i++) {
if (Integer.valueOf(mask[i]) < 0 || Integer.valueOf(mask[i]) > 255
|| Integer.valueOf(ip1[i]) < 0 || Integer.valueOf(ip1[i]) > 255
|| Integer.valueOf(ip2[i]) < 0 || Integer.valueOf(ip2[i]) > 255) {
System.out.println(1);// IP地址或子網掩碼格式非法
break;
} else if ((Integer.valueOf(mask[i]) & Integer.valueOf(ip1[i])) ==
(Integer.valueOf(mask[i]) & Integer.valueOf(ip2[i]))) {
System.out.println(0);// IP1與IP2屬於同一子網
break;
} else {
System.out.println(2);// IP1與IP2不屬於同一子網路
break;
}
}
}
}
}
說明:自我感覺這道題的解題過程主要轉換解決物件。原本考慮的是分別驗證子網掩碼、IP1和IP2的合法性,然後在分別驗證子網掩碼和IP1和IP2的與運算結果。這樣操作也能實現,但可能操作比較麻煩。換種解題思路,因為子網掩碼和IP地址的格式都是四個數字組成,因此用一個for迴圈同時控制子網掩碼和IP1和IP2,這樣for迴圈執行四次所有的驗證和與運算就結束了。