こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

サブネットマスクがいまいちよく理解できません。
論理積の話が出てくるのですが、色々調べてみても、「論理積を求める計算を行うと、以下のようになります」等で計算結果しか書いてありません。

具体的な計算式が知りたいです。
PHPで、以下のAND計算をしてみましたが、当たり前に1が返ってきてしまいます。
print ("210.161.126.144" and "255.255.255.240");

分かりやすくご教授願えればと思います。

投稿日時 - 2007-04-27 21:30:29

QNo.2955442

困ってます

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

プログラマーに教える場合ですが、

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アドレスとサブネットの論理積をとり
これと比較し異なっていれば、ゲートウェイに向かって
データを送信します。

(サブネットマスクは、ゲートウェイにデータを送信すべきか
どうかを判断するときに使われます)

投稿日時 - 2007-04-28 11:40:45

お礼

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

投稿日時 - 2007-05-01 13:50:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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プロトコルの世界では同一のネットワークアドレスに属する端末であると認識します。

分かりづらいかもしれません・・・・不明な点があれば、補足欄などに書いてください。

投稿日時 - 2007-04-28 00:11:15

お礼

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

投稿日時 - 2007-05-01 13:55:57

ANo.1

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

投稿日時 - 2007-04-27 22:00:43

お礼

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

投稿日時 - 2007-05-01 13:51:29

あなたにオススメの質問