1. 程式人生 > >Java-NowCoder-判斷兩個IP是否屬於同一子網

Java-NowCoder-判斷兩個IP是否屬於同一子網

題目要求:

    子網掩碼是用來判斷任意兩臺計算機的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迴圈執行四次所有的驗證和與運算就結束了。