「上位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
である.
暗算方法
以下の手順でビット表現なしに暗算する方法がある.
- サブネット部を含むオクテットに着目.上の例の場合
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
である.