判斷兩個IP時候屬於同乙個子網(華為機試)

2021-10-04 10:13:21 字數 3042 閱讀 7082

給定兩個ip和乙個子網掩碼,判斷兩個ip是否屬於同一子網。輸出0代表不是同一子網,輸出1代表是同一子網。同時輸出第乙個ip與子網掩碼相與的結果。

保證輸入資料合法

子網掩碼:11111111.11111111.11111111.00000000

and運算:11010000.10101000.00000000.00000000 轉化為十進位制後為: 192.168.0.0

輸入一行字元 代表兩個ip和乙個子網掩碼,中間實用空格隔開

eg1: 192.168.1.1 192.168.1.2 255.255.255.0

eg2: 182.168.1.1 192.168.2.1 255.255.255.0

如果兩個ip是同一子網輸出0,否則輸出1。同時輸出第乙個ip與子網掩碼相與的結果(10進製)

與輸入相對應輸出:

eg1: 1 192.168.1.0

eg2: 0 192.168.1.0

輸入我是讀入了三個字串,然後使用遍歷的方法將數字給分離出來的(這很蠢)

將ip1,ip2,mask分別轉換成對應的32位二進位制形式的01陣列(對每個數字進行十進位製到二進位制的轉換)

兩個ip分別於mask相與,結果仍然是32位的二進位制陣列,然後逐位進行比較,即可得出是否是同一子網

將ip1與mask相與後的二進位制陣列再轉換為對應的十進位制形式的ip輸出即可

很明顯,這種轉換費時費力,很麻煩,很容易出錯。所以這種方法很笨

#include#include#include#includeusing namespace std;

vectortranstoarray(char str); //將乙個ip字串轉換為各個部分對應的整數,進一步轉換為二進位制返回

vectortrans_to_b2(int num); //將乙個十進位制的數轉換為它的二進位制逆序 eg:2 -->01

void isright(vectorip1, vectorip2, vectormask);//判斷兩個ip是否在同一子網下,並列印ip1與mask的與值

int trans_to_num(vectorip);//將二進位制的ip再轉換為十進位制

int main()

void isright(vectorip1, vectorip2, vectormask)

else

} for(int i=0; i<32; i++)else

} for(int i=0; i<32; i++)

} printf("%d ",k);

trans_to_num(ip1);

}vectortranstoarray(char str)//把字串轉換為二進位制儲存

對乙個字串型的ip怎麼分割?詳見c我的另一篇部落格:c++中的字串分割函式-----strtok

對應數字也不需要轉換為二進位制進行相與運算,直接用位與運算子即可。eg: 1&2 等價00000001&00000010,結果就是十進位制的0

#include#include#include#includeusing namespace std;

vectorsplit(char str);

//將字串192.168.1.1 轉換為四個字串 192 168 1 1儲存在vector陣列中

vectortrans_to_num(vectors);

//將vector陣列中的四個字串 轉換成四個整數 儲存在vector陣列中

bool issame(vectorip1,vectorip2,vectormask);

//判斷ip1和ip2是否在同乙個子網,採用與運算,就不用轉換2進製了

void print(vectorip1,vectormask);

//輸出第乙個ip與mask相與的結果

int main()

else

return 0;

} vectorsplit(char str)

}while(p);

return s;

}vectortrans_to_num(vectors)

nums.push_back(num);

} return nums;

}bool issame(vectorip1,vectorip2,vectormask)

{ for(int i=0; iip1,vectormask)

{ for(int i=0; i怎麼搞呢?使用scanf的格式化輸入,直接得到數字(不需要和傻子一樣先拆分,再轉換,沒錯,我就是傻子)!!!

具體是,如果在格式控制字串中除了格式宣告以外還有其他字元,則在輸入資料時必須在對應位置上輸入與這些字元相同的字元

**:int a,b,c;

scanf("a=%d,b=%d,c=%d",&a,&b,&c);

命令列輸入:

a=1,b=3,c=2

這時才會將1 3 2分別送入整形變數a,b,c中

我們只用規定乙個scanf("%d.%d.%d.%d",&a,&b,&c,&d);就可以輕鬆分解輸入的ip了 

具體實現見我的另一篇部落格:判斷兩個ip是否屬於同一子網(牛客網)

兩個題目在輸入輸出要求是不一樣的,所以寫了兩個 

如何判斷兩個IP屬於同乙個網路

ip位址 網路位址 主機位址 又稱 主機號和網路號組成 ip位址是乙個 4 8bit 1位元組 由 0 1 組成的數字串 ip4協議 子網掩碼又叫網路掩碼 位址掩碼 子網路遮罩,是乙個 4 8bit 1位元組 由 0 1 組成的數字串 它的作用是遮蔽 遮住 ip位址的一部分以劃分成網路位址和主機位址...

判斷兩個IP是否屬於同一子網(20200309)

子網掩碼是用來判斷任意兩台計算機的ip位址是否屬於同一子網路的根據。子網掩碼與ip位址結構相同,是32位二進位制數,其中網路號部分全為 1 和主機號部分全為 0 利用子網掩碼可以判斷兩台主機是否中同一子網中。若兩台主機的ip位址分別與它們的子網掩碼相 與 後的結果相同,則說明這兩台主機在同一子網中。...

判斷兩個IP位址是否在同乙個網段及子網掩碼設定

一 什麼是子網掩碼?在了解ip位址的網段之前,我們先來了解子網掩碼,很多對網路了解不深的朋友都對子網掩碼有些迷惑,不了解它是用來幹什麼的?子網掩碼不能單獨存在,它必須結合ip位址一起使用。子網掩碼只有乙個作用,就是將某個ip位址劃分成網路位址和主機位址兩部分。說的通俗的話,就是用來分割子網和區分那些...