• ベストアンサー

サブネットマスクがよくわかりません

サブネットマスクがいまいちよく理解できません。 論理積の話が出てくるのですが、色々調べてみても、「論理積を求める計算を行うと、以下のようになります」等で計算結果しか書いてありません。 具体的な計算式が知りたいです。 PHPで、以下のAND計算をしてみましたが、当たり前に1が返ってきてしまいます。 print ("210.161.126.144" and "255.255.255.240"); 分かりやすくご教授願えればと思います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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アドレスとサブネットの論理積をとり これと比較し異なっていれば、ゲートウェイに向かって データを送信します。 (サブネットマスクは、ゲートウェイにデータを送信すべきか どうかを判断するときに使われます)

karace
質問者

お礼

詳細なご回答ありがとうございました。

その他の回答 (2)

  • incho0922
  • ベストアンサー率41% (84/204)
回答No.2

仮に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プロトコルの世界では同一のネットワークアドレスに属する端末であると認識します。 分かりづらいかもしれません・・・・不明な点があれば、補足欄などに書いてください。

karace
質問者

お礼

回答ありがとうございます。 疑問だった部分がわかりました。 論理積は、2進数変換後の値を「1ビット」ごとに比較するわけですね。 この部分がよくわかっていませんでした。ありがとうございました。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

>210.161.126.144 この表現は人間にわかりやすく書いただけのものです。 2進法できちんと書くと11010010101000010111111010010000 となります。 なお論理積では答えが0か1しか返らない文法が多いです。

karace
質問者

お礼

回答ありがとうございます。

関連するQ&A

専門家に質問してみよう