「上位nビットを求める」「下位nビットを求める」といった操作をアドレス演算ではよく行う.そのときのマスクを16進数表記ですぐに求められるのが望ましい.
またCIDR表記からサブネットアドレスなどをすぐに求められると嬉しい.
2進数と16進数の変換を暗算する
2進数を4bitづつ区切ればよい.そのとき
b1 = 0x1b11 = 0x3b111 = 0x7b1111 = 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 >> 7bottom = addr & 0x7f
上位23bit,下位9bitを求める
top = addr >> 9bottom = addr & 0x1ff
上位17bit,下位15bitを求める
top = addr >> 15bottom = 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 である.
暗算方法
以下の手順でビット表現なしに暗算する方法がある.
- サブネット部を含むオクテットに着目.上の例の場合
90 - (そこでのサブネットマスクの値を求め,256から引く.上の例の場合,上位27-24=3桁だから,128+64+32=224を256から引いて32).これは256からサブネットの桁数だけ128を半減した値を引いていくことなので,はじめから256-128-64-32=32すれば良い.
- (1)の値をぎりぎり超えない(2)の値の倍数を求める.この数字がネットワークアドレス.上の例の場合は64(32x2)より
192.168.1.64 - (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である.