開発ツール

基数変換のやり方をわかりやすく解説(2進数・8進数・16進数)

1 分で読了

10進数を2進数や16進数に変換するには、対象の基数で繰り返し割り算をして余りを下から上に並べるか、2のべき乗の組み合わせに数値を分解します。基数変換は情報処理技術者試験の定番テーマであり、メモリアドレスやカラーコード、Linuxのパーミッション表記など実務でも頻繁に登場します。この記事では10進数202を例に手順を追い、8進数755がなぜ10進数493になるのかも解説します。

基数(進数)とは何か

基数(radix)とは、位取り記数法が1桁に使う固有の数字の個数のことです。普段使っている10進数は0から9までの10種類の数字を使い、各桁は10のべき乗の重みを持ちます。たとえば10進数の「202」は百の位が2、十の位が0、一の位が2を表し、2×10^2 + 0×10^1 + 2×10^0 = 200 + 0 + 2 = 202という計算になります。

2進数(base 2)は0と1の2種類の数字だけを使い、各桁は2のべき乗を表します。8進数(base 8)は0から7までの8種類、16進数(base 16)は0から9に加えてAからFまでのアルファベット6文字を使い、10から15の値をそれぞれ1文字で表します。どの基数でも表している値そのものは変わらず、その値をどんな記号の組み合わせで書き表すかが違うだけです。

10進数を2進数・8進数・16進数に手計算で変換する

10進数から他の基数へ変換する方法は大きく2つあります。ひとつは剰余法で、対象の基数で割り続けて余りを記録し、最後に下から上へ読み上げる方法です。もうひとつは位取り法で、その数以下で最大の2のべき乗を探して引き算を繰り返す方法です。位取り法は主に2進数への変換で使われます。

10進数202を例に、まず剰余法で8進数に変換します。

計算余り
202 ÷ 8252
25 ÷ 831
3 ÷ 803

余りを下から上に読むと3、1、2の順になり、8進数は312です。

同じ方法を16進数にも使います。16進数では10から15の余りをA〜Fの文字に置き換えます。

計算余り
202 ÷ 161210(A)
12 ÷ 16012(C)

余りを下から上に読むとA、Cの順になり、16進数はCAです。

2進数への変換は位取り法で確認すると理解しやすくなります。202以下で最大の2のべき乗は128(2^7)なので、まず128を引いて74が残ります。74以下で最大の2のべき乗は64(2^6)なので引いて10が残ります。10以下で最大の2のべき乗は8(2^3)なので引いて2が残り、2はそのまま2^1です。つまり202は128+64+8+2という4つの2のべき乗の和で表せます。

桁の重み1286432168421
ビットが立つか11001010

上の表で1が立っている桁を左から並べると11001010となり、これが202の2進数表現です。剰余法で2で割り続けて余りを記録しても同じ結果になります。まとめると、10進数202は2進数11001010、8進数312、16進数CAです。

ちなみに10進数4096(2^12)のようなちょうど2のべき乗の数を変換すると、2進数は1000000000000、8進数は10000、16進数は1000というように、どの基数でも「1」の後にゼロが並ぶきれいな形になります。

8進数・16進数を10進数に読み替える

逆方向、つまり8進数や16進数から10進数への変換も同じ位取りの考え方で計算できます。各桁にその基数のべき乗を掛けて合計するだけです。

Linuxのファイルパーミッションでよく見る8進数755を例にします。755は所有者に読み書き実行、グループとその他に読み実行の権限を与える値として現場で頻繁に登場する、なじみのある数値です。3桁それぞれに8のべき乗を掛けます。7×8^2 + 5×8^1 + 5×8^0 = 7×64 + 5×8 + 5×1 = 448 + 40 + 5 = 493。つまり8進数755は10進数493です。

2進数に変換するときは、8進数の1桁がちょうど3ビットに対応するという性質を使うと暗算しやすくなります。7は111、5は101、もう一つの5も101なので、3桁をそのままつなげると111101101になります。桁ごとに区切って書くと111 101 101です。16進数に変換すると1EDになります。

16進数でも同じ考え方が使え、16進数の1桁はちょうど4ビット(ニブル)に対応します。だからこそ16進数は2進数の省略表記として開発現場で好まれます。0xFFはたった2文字ですが、2進数では11111111という8桁になります。メモリアドレスやカラーコード(#RRGGBB)、エラーコードの表記に16進数が使われるのはこのためです。8進数も同様の理由でかつてのコンピューターのワード長設計に使われ、その名残がUnix系のパーミッション表記(chmod)に今も残っています。

自分の数値で試してみる

ここまでの手順を毎回手計算するのは大変です。以下のツールに数値を入力すると、2進数・8進数・10進数・16進数の4つの表現がその場ですべて更新されます。

基数変換ツール
無料、登録不要、どの端末でも使えます。
フルツールを開く

よくある間違いと注意点

負の数を2の補数だと思い込む。 このツールは負の数を符号絶対値表現で扱います。2の補数ではありません。たとえば10進数の-18を入力すると、2進数は-10010、8進数は-22、16進数は-12と表示されます。これは18の各基数表現の頭に単純にマイナス記号を付けただけの値です。8ビットの2の補数表現で-18を考えると11101110というまったく異なるビット列になるため、符号付き整数のビット演算を前提にプログラミングをしている人ほどこの違いに戸惑いがちです。このツールの出力は符号付きビット演算のシミュレーターではなく、数値の大きさと符号を分けて表示するものだと理解しておいてください。

16進数のアルファベットの大文字・小文字を気にしすぎる。 入力するときはaからfでもAからFでもどちらでも構いません。ただし出力は常に大文字(A〜F)で表示されます。

先頭のゼロが値を変えると勘違いする。 2進数の00101と101、8進数の007と7は、それぞれ同じ値を表します。先頭のゼロはどの基数でも桁数を揃えるための表記上の工夫にすぎず、値そのものには影響しません。

非常に大きな数値で誤差が出る。 このツールはJavaScriptが安全に扱える整数の範囲、おおよそ2^53-1(約9000兆)までを前提にしています。これを超える桁数の数値を扱う場合は、専用の多倍長整数ライブラリを使うほうが安全です。

プログラミング言語の接頭辞と混同する。 JavaScriptやPythonなどのコードでは、2進数リテラルに0b、8進数に0o、16進数に0xという接頭辞を付けます(0b101、0o17、0xFFなど)。このツールの各入力欄はそうした接頭辞なしの、純粋な数字だけを想定しています。コードからコピーした値を貼り付けるときは、接頭辞を取り除いてから入力してください。

よくある質問

基数(進数)とは結局何ですか? 位取り記数法が1桁にいくつの数字を使うかを表す数のことです。10進数なら10種類(0〜9)、2進数なら2種類(0と1)というように、基数の数だけ固有の数字が存在し、桁が上がるごとにその基数のべき乗が重みになります。

2進数を10進数に手計算で変換するにはどうすればいいですか? 右端の桁から順に2^0、2^1、2^2……という重みを掛けて、1が立っている桁の値をすべて足します。たとえば11001010なら、ビットが立っている位置は128、64、8、2で、合計すると128+64+8+2=202になります。

なぜプログラマーは16進数をよく使うのですか? 16進数の1桁がちょうど2進数の4ビット(ニブル)に対応するため、長い2進数の桁を短く読みやすい形で表せるからです。メモリアドレス、カラーコード(#RRGGBB)、バイト値、エラーコードなど、2進数と1対1で対応させたい場面で広く使われています。

このツールが扱える最大の数値はどれくらいですか? JavaScriptの安全な整数の範囲内、目安として2^53-1(約9000兆)までです。それより大きい桁数の数値は精度が保証されないため、専用の多倍長整数ライブラリの利用をおすすめします。

負の数は変換できますか? はい。どの入力欄でも数値の前にマイナス記号を付ければ、他の3つの基数にも符号付きで反映されます。ここで使われているのは符号絶対値表現で、2の補数ではない点に注意してください。

入力した値をそのままURLで共有できますか? はい。入力するたびにURLが自動的に更新されるので、アドレスバーの値をコピーするか共有ボタンを使えば、リンクを開いた相手にも同じ4つの基数の値がそのまま表示されます。

基数変換2進数16進数プログラミング
基数変換ツール
今すぐフルツールで試してみましょう。
今すぐ試す