「上位nビットを求める」「下位nビットを求める」といった操作をアドレス演算ではよく行う.そのときのマスクを16進数表記ですぐに求められるのが望ましい.

またCIDR表記からサブネットアドレスなどをすぐに求められると嬉しい.

2進数と16進数の変換を暗算する

2進数を4bitづつ区切ればよい.そのとき

  • b1 = 0x1
  • b11 = 0x3
  • b111 = 0x7
  • b1111 = 0xf

を使う.例えば

b|0111|0011|0001|
=
0x731

b|1111|0111|0011|
=
0xf73

b|1111|1111|0111|
=
0xff7

b|0111|1111|0011|0001|
=
0x7f31

下位nビットを求めるマスク

くどいがいくつか並べておこう.下位15bitを求めるのであれば15 = 3 + 4 + 4 + 4より0x7fffと置き換えればよい.

下位nビット マスク
下位1bit 0x1
下位2bit 0x3
下位3bit 0x7
下位4bit 0xf
下位5bit 0x1f
下位6bit 0x3f
下位7bit 0x7f
下位8bit 0xff
下位9bit 0x1ff
下位10bit 0x3ff
下位11bit 0x7ff
下位12bit 0xfff
下位13bit 0x1fff
下位14bit 0x3fff
下位15bit 0x7fff
下位16bit 0xffff
下位17bit 0x1ffff
下位18bit 0x3ffff
下位19bit 0x7ffff
下位20bit 0xfffff

上位と下位の値を求める

32bit値addrの上位と下位の値を求める.

上位25bit,下位7bitを求める top = addr >> 7 bottom = addr & 0x7f

上位23bit,下位9bitを求める top = addr >> 9 bottom = addr & 0x1ff

上位17bit,下位15bitを求める top = addr >> 15 bottom = addr & 0x7fff

16進数から2進数

0x100000 = 1MBをすぐに暗算できるようにしたい.16進数での0は2進数では0000 = 10^4である.0x100000では0が5つ並んでいるから

0x100000 = 1 x 10^(4x5) = 1 x 10^20

である.つまり1MB.

CIDR表記

ここ を参照した.192.168.1.90/27 のサブネットマスクを求めたい.愚直に計算すると 192.168.1.90 = 192.168.1.01011010 であるから,サブネットマスクは 192.168.1.010/00000 = 192.168.1.64 がサブネットマスクとなる.よってブロードキャストアドレスは 192.168.1.010/11111 = 192.168.1.95 である.

暗算方法

以下の手順でビット表現なしに暗算する方法がある.

  1. サブネット部を含むオクテットに着目.上の例の場合 90
  2. (そこでのサブネットマスクの値を求め,256から引く.上の例の場合,上位27-24=3桁だから,128+64+32=224を256から引いて32).これは256からサブネットの桁数だけ128を半減した値を引いていくことなので,はじめから256-128-64-32=32すれば良い.
  3. (1)の値をぎりぎり超えない(2)の値の倍数を求める.この数字がネットワークアドレス.上の例の場合は64(32x2)より 192.168.1.64
  4. (1)の値をぎりぎり超える(2)の値の倍数-1がブロードキャストアドレス.上の例の場合96(32x3)-1=95より 192.168.1.95 例えば 172.16.20.101/21 では20 がサブネット部のオクテットであり,(2)の値は8となる.20を超えない倍数は16,20を超える倍数は24だから,ネットワークアドレスとブロードキャストアドレスはそれぞれ 172.16.16.0, 172.16.23.255 である.