/24や/16のように8の倍数で切れるCIDRなら、ネットワークアドレスは「該当する上位オクテットをそのまま使い、残りを0で埋める」だけで求まります。 ところが/26や/27のように、1つのオクテットの途中でビットが切れるCIDRが出てくると、この十進数の感覚は通用しなくなります。 192.168.1.130/26を例に、最後のオクテット(130)だけを2進数で見ながら、ネットワークアドレスとブロードキャストアドレスがどう求まるのかを追ってみます。

サブネットマスクを2進数で並べる

/26は「先頭26bitが1、残り6bitが0」という意味です。32bitのうち先頭3オクテット(24bit)はすべて1なので255.255.255、最後のオクテットは8bitのうち先頭2bitだけが1の11000000で、10進数にすると192になります。 つまりサブネットマスクは255.255.255.192です。ここまでは多くの解説で見る話で、特に難しくありません。

ANDでネットワークアドレスを求める

ネットワークアドレスは「IPアドレスとサブネットマスクをビットごとにAND演算する」ことで求まります。 最後のオクテットだけ見ると、IPアドレス130は2進数で10000010、マスク192は11000000です。これを1bitずつANDすると次のようになります。

  10000010  (130: IPアドレス)
& 11000000  (192: サブネットマスク)
-----------
  10000000  (128: ネットワークアドレス)

AND演算は「両方が1のときだけ1」になる演算なので、マスク側が0のビット(ホスト部)は問答無用で0に落ち、マスク側が1のビット(ネットワーク部)はIPアドレスの値がそのまま残ります。 結果は128。つまり192.168.1.130/26のネットワークアドレスは192.168.1.128です。十進数の感覚だと130から128への変化は唐突に見えますが、ビットで見れば「ホスト部の6bitを0で塗りつぶした」という単純な操作でしかありません。

ORでブロードキャストアドレスを求める

ブロードキャストアドレスは、ネットワークアドレスのホスト部を全部1に塗りつぶしたものです。 これを実現するのが「ホストマスク(サブネットマスクの反転)とのOR演算」です。サブネットマスク192の反転(NOT)は00111111、10進数で63になります。これがホストマスクです。

  10000000  (128: ネットワークアドレス)
| 00111111  (63:  ホストマスク = サブネットマスクの反転)
-----------
  10111111  (191: ブロードキャストアドレス)

OR演算は「どちらかが1なら1」になる演算です。ホストマスク側が1のビット(ホスト部)はネットワークアドレスの値に関係なく1に上書きされ、ホストマスク側が0のビット(ネットワーク部)はネットワークアドレスの値がそのまま残ります。 結果は191なので、ブロードキャストアドレスは192.168.1.191です。ホストとして使えるのはネットワークアドレスとブロードキャストアドレスを除いた192.168.1.129〜192.168.1.190の62個になります(2^6-2=62)。

なぜ十進の足し算ではなくビット演算なのか

/24や/16のようにオクテットの境界で揃うCIDRなら、十進数のまま「このオクテットは固定、それ以降は0または255」と考えても答えは合います。 しかし/26のように境界がオクテットの内側に来ると、十進の足し算・引き算ではどこからどこまでがネットワーク部でどこからがホスト部かを正しく扱えません。AND・ORはビット単位で動くため、プレフィックス長がオクテットのどこで切れていても同じ手順で計算できます。 ip-cidr-calculatorの内部実装も、IPアドレスを32bitの整数に変換したうえで同じAND・OR演算で計算しており、オクテット単位の特別扱いは一切していません。

実際のIPアドレスとCIDRでネットワークアドレス・ブロードキャストアドレス・利用可能ホスト数を確認したい場合は、以下のツールで2進数表示も含めて確認できます。