- ベストアンサー
サブネットマスクがよくわかりません
サブネットマスクがいまいちよく理解できません。 論理積の話が出てくるのですが、色々調べてみても、「論理積を求める計算を行うと、以下のようになります」等で計算結果しか書いてありません。 具体的な計算式が知りたいです。 PHPで、以下のAND計算をしてみましたが、当たり前に1が返ってきてしまいます。 print ("210.161.126.144" and "255.255.255.240"); 分かりやすくご教授願えればと思います。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
プログラマーに教える場合ですが、 AND は ビットOFF OR は ビットON XOR は ビットの反転 に使う と教えています。 目的の変数を a とすると (aを16ビット整数とします) a = a & 0xff00 a の 0xff00の対応する 00の部分を0にする a = a | 0x00ff a の 0x00ffの対応する ffの部分をfにする a = a ^ 0xffff a の 全部分のビットを反転する 上記のような演算式 で 右辺の 0x~ の項を マスクと言います。 また、IPアドレスの計算は WinSockのライブラリに専用の関数や 構造体がありますので、それを使います ////////////////////////////////////////////////////////////////// #include <stdio.h> #include <winsock.h> int main() { unsigned long addr, mask ; struct in_addr saddr; char xaddr[16], *paddr; addr = inet_addr("210.161.126.144"); // アドレスの文字列を整数に変換 mask = inet_addr("255.255.255.240"); addr = addr & mask; // マスク演算 saddr.S_un.S_addr = addr; // 専用の構造体に入れる paddr = xaddr; paddr = inet_ntoa(saddr); // 整数のアドレスを文字列に変換 printf("addres=%s \n",paddr); } /////////////////////////////////////////////////// 結果は"210.161.126.144"と表示されます (このアドレスはサブネット"255.255.255.240"の下ではホストとして使用できません) おそらくこれはネットワーク外部のアドレスでしょう。 PCは自分のIPアドレスとサブネットの論理積をとり これと比較し異なっていれば、ゲートウェイに向かって データを送信します。 (サブネットマスクは、ゲートウェイにデータを送信すべきか どうかを判断するときに使われます)
その他の回答 (2)
- incho0922
- ベストアンサー率41% (84/204)
仮にIPアドレスが4ビットだとします。 端末AのIPアドレスは10、端末BのIPアドレスは11、サブネットマスクは8とします。 10、11、8を2進数に直すとそれぞれ1010、1011、1000になります。 ここで論理積の話ですが、ここでの論理積はビットごとの論理積です。 1 AND 1 = 1、1 AND 0 = 0、0 AND 0 = 0をビットごとに考えてください。 1010(端末AのIPアドレス)と1000(サブネットマスク)をビットごとに考えると、 先頭ビットは1AND1=1 第二ビットは0AND0=0 第三ビットは1AND0=0 第四ビットは0AND0=0ですから、 1000になります。 同様に端末BのIPアドレスとサブネットマスクのビットごとのANDを取ると1000になります。 このように、端末のIPアドレスとサブネットマスクのビットごとのANDが一致するとき、IPプロトコルの世界では同一のネットワークアドレスに属する端末であると認識します。 分かりづらいかもしれません・・・・不明な点があれば、補足欄などに書いてください。
お礼
回答ありがとうございます。 疑問だった部分がわかりました。 論理積は、2進数変換後の値を「1ビット」ごとに比較するわけですね。 この部分がよくわかっていませんでした。ありがとうございました。
- ymmasayan
- ベストアンサー率30% (2593/8599)
>210.161.126.144 この表現は人間にわかりやすく書いただけのものです。 2進法できちんと書くと11010010101000010111111010010000 となります。 なお論理積では答えが0か1しか返らない文法が多いです。
お礼
回答ありがとうございます。
お礼
詳細なご回答ありがとうございました。