• ベストアンサー

16進数でのAND演算

IPアドレス:172.16.1.20 サブネットマスク:255.255.255.128の場合 ・ある問題集で、16進数を使って上のIPアドレスからネットワークアドレスを求める場合に、 (1).IPアドレスを16進数→    AC 10 01  14 (2).サブネットマスクを16進数→FF FF FF 80                   --------- (3).ネットワークアドレス→   AC 10  01 00                            ~~  という感じで解答していたのですが、どうやって求めたのか分かりません。(3)の左から6桁と一番右は、(1)と(2)を比較して小さい方をとっていますが、右から2番目だけは1と8を比較して0となっているのはなぜでしょうか?教えてください。

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

  • ベストアンサー
回答No.6

#5の補足に対して。 > その問題集には「2進数でもよいが桁が大きくなりすぎるので16進数での演算に慣れるように。」と、あったのですが16進数のままでANDをとる方法はないのでしょうか? そもそも、論理演算自身が1ビットに対して行う演算なので2進数で演算するのが基本です。 255D(=0xff)だとか128D(=0x80)のような「わかりやすい」値ならともかく、変なビットの並びであれば16進数で計算するより2進数で計算する方がよっぽど「自然」です。 その証としてこれまでの回答者の皆さんは、2進数に直して計算する方法で解説していますし、あなた自身も16進数で?だったことが2進数で理解できました。 10進数を16進数に直すには10進数→2進数→16進数とするのが普通です(計算しやすい)。2進数が出た時点で論理演算するのが得策です。なぜなら、2進数→16進数の変換が要らない上に、16進数の方が論理演算しにくいのですから。 その問題集は、問題を解くだけのための解説に陥ってます。

noname#13006
質問者

お礼

ありがとうございました。 へたに特別な方法を覚えずに今までどおり地道に2進数でやるようにします。 

その他の回答 (5)

  • rot-N
  • ベストアンサー率27% (118/432)
回答No.5

必要なbitだけを取り出すのに、ANDの演算をします。 16進数を2進数に戻し、各bit毎にANDの演算をしているだけです。 それ以上の説明が必要であれば、もう少し手前から勉強をし直すこと。 以上(^o^)。

noname#13006
質問者

補足

ご回答ありがとうございました。  その問題集には「2進数でもよいが桁が大きくなりすぎるので16進数での演算に慣れるように。」と、あったのですが16進数のままでANDをとる方法はないのでしょうか?

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.4

参考URLを参考にすると良いかもしれません。

参考URL:
http://mt-net.vis.ne.jp/ADFE_mail/0212.htm
noname#13006
質問者

お礼

ご回答ありがとうございました。教えていただいたことを今後の勉強に役立てたいと思います。

  • th9
  • ベストアンサー率59% (192/321)
回答No.3

16進で考えると分かりにくいかもしれません。 実際にはこれらの演算は2進で行われますので、2進数に変換してみます。 すると、 (1)10101100 00010000 00000001 00010100 (2)11111111 11111111 11111111 10000000 ですので、この2つのANDを取ると (3)10101100 00010000 00000001 00000000 となります。 これを16進に戻すと最初の答えになります。 サブネットマスクとはホストアドレスの上位何ビットかをマスクして、サブネットアドレスとホストアドレスに分割するために使用するものなので、一度2進数に変換して考えていただければ分かりやすいと思います。

noname#13006
質問者

お礼

ご回答ありがとうございました。教えていただいたことを今後の勉強に役立てたいと思います。

  • kaZho_em
  • ベストアンサー率50% (2950/5879)
回答No.2

AND演算は、ビット単位の演算です。比較する双方のビットが1の時のみ1になります。どちらか片方 または双方共に0なら演算結果は0です。 さて、(1)、(2) は、2進数で書くと (1) 1010 1100 0001 0000 0000 0001 0001 0100 (2) 1111 1111 1111 1111 1111 1111 1000 0000 となり、各ビットをAND演算すると (3) 1010 1100 0001 0000 0000 0001 0000 0000 となり、16進表現で AC 10 01 00 となります。

noname#13006
質問者

お礼

ご回答ありがとうございました。教えていただいたことを今後の勉強に役立てたいと思います。

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

2進に直して考えるとわかりやすいのでは? 80は10000000ですので。 14は00010100です。 これでかければ下の方の10100が消えるのがわかると思いますが。

noname#13006
質問者

お礼

ご回答ありがとうございました。教えていただいたことを今後の勉強に役立てたいと思います。

関連するQ&A