手軽屋
ツール一覧

基数変換シリーズ #2

16進カラーコードと2進ビットの読み替え

CSSやHTMLの色指定 #FF6600 は何を表しているのか。なぜ10進ではなく16進なのか。基数変換の視点から、Webの色の仕組みをほどきます。

#RRGGBB の中身

Webの色は #RRGGBB の形式で、頭2桁が赤の強さ、次2桁が緑、最後2桁が青の強さを表します。各色は16進数2桁=00〜FF(10進で0〜255)の256段階です。

たとえば #FF6600 は「赤=FF(=255、最大)/ 緑=66(=102)/ 青=00(=0)」というオレンジ色になります。

なぜ16進なのか

色の強さは内部的には2進数8桁(8ビット=1バイト)で表されています。Wikipedia「十六進法」によれば、16は2の4乗なので、2進4桁=16進1桁。つまり2進8桁=16進2桁にきれいに対応します。

赤=255 = 1111 1111 (2進) = FF (16進)
緑=102 = 0110 0110 (2進) = 66 (16進)
青= 0  = 0000 0000 (2進) = 00 (16進)

10進だと「255, 102, 0」と桁が揃わずバラバラですが、16進だと常に2桁。CSSが16進数を採用しているのはこの「桁が揃って短い」のが理由です。

2進⇔16進が一瞬な理由

2進数を16進数に直すときは、右から4桁ずつ区切って、それぞれを16進1桁に置き換えるだけです。割り算は不要。

2進: 1010 1101
       ↓    ↓
16進:  A    D
→ AD

逆方向(16進→2進)も同様に、各桁を2進4桁に展開するだけ。これが情報処理試験で「2進・16進は事実上ペア」と扱われる理由です。

短縮形 #RGB と #RRGGBB

CSSでは #FFF や #F60 のような3桁形式も使えます。これは #FFFFFF や #FF6600 の省略形で、1桁を2回繰り返した形と等価です。

短縮形では表現できる色が4096色に減りますが、コードが短く読みやすくなります。

透明度(#RRGGBBAA)

モダンブラウザではアルファチャンネル(透明度)も追加した8桁形式が使えます。末尾2桁が透明度(00=完全透明、FF=不透明)です。

実際に色を確認するには

16進コードから実際の色を見るにはカラーコード変換が便利です。10進RGB(255, 102, 0)と16進(#FF6600)の相互変換と、色のプレビューを同時に表示します。

16進→2進の計算を確認するなら本体の2進数・16進数変換で「4桁ずつ対応」表示を見ると関係が一目で分かります。

関連リンク