読了 約 5 分
進数変換をマスターせよ!2進数・10進数・16進数の相互計算とプログラミング・ネットワーク実務での応用事例
#technology
執筆: デジタル道具屋 編集部
Web 開発・運用に従事するエンジニアとデザイナーで構成された編集チーム。記事は実務での使用経験と公式仕様(RFC・W3C・各ベンダードキュメント)を参照して執筆しています。
本記事の執筆方針と編集ポリシーについてはAbout ページをご覧ください。
なぜコンピューターの世界には「10進数」以外の数字が溢れているのか?

「博士!プログラミングを勉強してたら `0xff` とか `0b1010` とか、見たことのない数字の書き方が出てきたんだぜ!普段使ってる10進数だけじゃダメなのかな?頭が混乱しちゃうんだよ。」

「フォッフォッフォ、もっともな疑問じゃな。我々人間は手の指が10本あることから自然と『10進数』を使うようになった。しかし、コンピューターの電子回路はスイッチの『ON(1)とOFF(0)』の2つの状態しか扱えん。そのため、基本的には『2進数』で動いておる。そして、長すぎる2進数を人間が読みやすく整理するために『16進数』が使われておるんじゃよ。」

「そうよ!例えば、カラーコードの `#FFFFFF` や、ネットワークのIPアドレスのサブネットマスクの計算、Linuxの権限設定の `chmod 755` も、すべて進数変換の仕組みがベースになっているの。エンジニアとしてこれを理解していないと、実務で全く話についていけなくなるわよ!」
1. 進数変換の基本:2進数・10進数・16進数の関係性と計算方法

「まずは進数ごとの桁上がりの仕組みをおさらいするのじゃ。 - **10進数 (Decimal)**: 0〜9の数字を使い、9の次で桁が上がる。 - **2進数 (Binary)**: 0と1の数字のみを使い、1の次で桁が上がる(例: 0, 1, 10, 11, 100...)。 - **16進数 (Hexadecimal)**: 0〜9に加えて A〜F(10〜15に対応)を使い、Fの次で桁が上がる(例: 8, 9, A, B... F, 10...)。 16進数の1桁は、2進数のちょうど4桁分(4ビット)に対応しておるため、非常に相性が良いのじゃ。」

「へぇ〜!それじゃあ `0xff` っていうのは10進数に直すと何になるんだぜ?」

「16進数の `F` は10進数の15よね。だから、`FF = 15 × 16 + 15 = 255` になるわ。1バイト(8ビット)で表現できる最大値がこの255(2進数の `11111111`)だから、プログラミングやネットワークのIPアドレス設計で非常によく見かける数値なのよ!」
進数変換・クイック早見表
- 2進数 0000: 10進数 0 / 16進数 0
- 2進数 1010: 10進数 10 / 16進数 A
- 2進数 1111: 10進数 15 / 16進数 F
- 2進数 10000000 (128): IPアドレスのサブネット計算などで頻出。第一ビットのみON。
- 2進数 11111111 (255): 16進数 FF(1バイトの最大値)。
2. 実務シナリオ:インフラとフロントエンドで役立つ進数変換

「具体的な実務シーンを見てみよう。ネットワークエンジニアがIPアドレス(例: `192.168.1.1`)とサブネットマスク(例: `255.255.255.0`)から『ネットワークアドレス』を算出する際、内部ではこれらを2進数に変換し、ビットごとの論理積(AND演算)を行っておるのじゃ。」

「なるほど!アドレスの範囲を計算するのに2進数が必須なんだな。」

「フロントエンド開発でも、CSSのカラーコード `#FF5733` (16進数)を、半透明(アルファ値)に変換するために `rgba(255, 87, 51, 0.5)` に書き換える作業があるわよね。これはRGBの各成分(FF, 57, 33)を10進数に変換(255, 87, 51)する計算そのものなのよ!」
3. プログラミングでの進数変換実装とツール活用

「JavaScriptなどの多くの言語には、数値を任意の進数の文字列に変換するメソッドが標準で用意されておる。 例えば、10進数の255を16進数の文字列にするには `(255).toString(16)` と書き、逆に16進数の文字列を10進数の数値にするには
parseInt('FF', 16) と書くのじゃ。」
「コードで書くとめっちゃ簡単なんだな!でも、デバッグ中に『このログに出てる16進数のエラーコード、2進数のビットフラグに直すとどこが立ってるんだ?』って手動で調べたいときはどうすればいいんだぜ?」

「そういうときこそ、デジタル道具屋の『進数変換ツール』の出番よ!10進数、2進数、16進数のどれか1つを入力するだけで、残りの進数表現がすべて同時にリアルタイムで表示されるから、手計算のミスが防げるし、ビットアライメントの確認も一瞬で終わるわよ!」
🚨 JavaScriptの数値リテラルと8進数(オクタル)の罠
JavaScriptや一部の言語では、数値の先頭に `0` (ゼロ)をつけると自動的に8進数として解釈されるレガシーな仕様があります。例えば `010` は10進数の `10` ではなく、8進数の `8` になってしまいます。ES6以降は `0o10` のように `0o` を用いるのが正式な8進数表現ですが、古いコードの保守や文字列から数値へのパース(変換)時には意図しない進数解釈が行われないよう、必ず `parseInt(str, 10)` のように第2引数で明示的に進数を指定してください。
まとめ:進数の概念を理解してコンピューターと対話しよう

「博士、2進数や16進数がなぜ必要なのか、どうやって計算するのかがすっきり繋がったぜ!」

「ネットワークの勉強でもプログラムのデバッグでも、進数変換は必ず付いて回るから、ツールを味方につけて効率よく作業を進めてね。」

「うむ、機械の気持ちを理解するには進数の理解が不可欠じゃ。ツールを使って様々な数値を変換し、パターンの規則性に慣れていくと良いぞい。」
進数変換は基本情報技術者試験などのIT資格でも必ず出題される超重要テーマじゃ。実務においては「ビッグエンディアンとリトルエンディアンによるバイトオーダーの違い」や「マイナス値の表現(2の補数)」といった発展的な話題とも深く結びついておる。まずは手軽な相互変換ツールで「どの進数でどう表現されるか」をビジュアルで体感してみるのが、理解への最速のロードマップじゃぞい!