進数変換(2進数・16進数・10進数)
値を1つ入れると、2進数・8進数・10進数・16進数をまとめて表示します。2〜36の任意の進数、小数(10.25 は 1010.01)、負数の2の補数(8bit・16bit・32bit)に対応。途中式として10進→2進の割り算列と2進→10進の重みの式も出すので、答えだけでなく手順の確認にも使えます。文字列とUTF-8の16進バイト列の相互変換もこのページで完結します。
このページの変換はすべてブラウザの中だけで動きます。入力した値や文字列がサーバーへ送られることはないので、ログやダンプの一部をそのまま貼り付けても外部には残りません。
進数とは「いくつで桁が上がるか」の違い
私たちが普段使う10進数は、0から9まで数えて次で桁が上がります。2進数は0と1だけで桁が上がり、16進数は0〜9のあとA〜Fの6文字を使って16個目で桁が上がります。数そのものは同じで、書き方だけが違う——これが進数変換の出発点です。
2進数: 11111111(8桁)
8進数: 377(3桁)
10進数: 255(3桁)
16進数: FF(2桁)
どれも「石を255個並べた状態」を指しています。桁が多いほど1桁あたりの情報が少ないだけです。
2進数から10進数へ(重みの和)
各桁には右から順に 20、21、22… という重みがついています。1が立っている桁の重みを足せば10進数になります。
10進数の123が 1×100 + 2×10 + 3×1 なのとまったく同じ考え方で、底が10か2かの違いだけです。
10進数から2進数へ(割り算の繰り返し)
2で割って余りを記録し、商が0になるまで続けます。最後に余りを下から読むと2進数になります。
11 ÷ 2 = 5 余り 1
5 ÷ 2 = 2 余り 1
2 ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
→ 余りを下から読んで 1011
上のツールは、入力した値についてこの割り算列と重みの式をそのまま表示します(長い場合は16行で打ち切ります)。手計算の答え合わせに使ってください。
16進数の1桁は2進数4桁(だから1バイトが2桁)
16は2の4乗なので、2進数4桁 = 16進数1桁がぴったり対応します。変換は4桁ずつ区切って置き換えるだけで、繰り上がりの計算は要りません。
右から4桁ずつ区切り、1111をF、1011をBに置き換えるだけ。逆向きも同じで、FBのFを1111、Bを1011に戻して並べます。1バイト=8ビット=2進数8桁なので、16進数ではきっかり2桁になります。
8進数も同じ理屈で、8は2の3乗なので2進数3桁 = 8進数1桁です。ファイル権限の 755 が扱いやすいのは、rwxの3ビットが8進数1桁に収まるからです。
0〜15の早見表
この16行を覚えてしまうと、長い2進数も4桁ずつ切って読めるようになります。
| 10進数 | 2進数(4桁) | 8進数 | 16進数 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
8進数の列が10進数と途中からずれるのは、8で桁が上がるためです(7の次が10)。16進数は逆に、10〜15の6つを1桁で書けるぶん10進数より短くなります。
2の累乗の表(桁数と上限値の目安)
「何ビットあれば何通り表せるか」「その型の最大値はいくつか」を確かめるための表です。
| 指数 | 10進数 | 16進数 | よく見る場面 |
|---|---|---|---|
| 2^0 | 1 | 1 | 1ビットで2通り(0か1) |
| 2^1 | 2 | 2 | フラグのオン・オフ |
| 2^2 | 4 | 4 | 2ビットで4通り |
| 2^3 | 8 | 8 | 1バイト=8ビット、8進数の底 |
| 2^4 | 16 | 10 | 16進数1桁=2進数4桁 |
| 2^5 | 32 | 20 | 32ビット環境 |
| 2^6 | 64 | 40 | 64ビット環境、Base64 |
| 2^7 | 128 | 80 | ASCIIの文字数、符号つき8bitの下限側 |
| 2^8 | 256 | 100 | 1バイトで表せる値の数(0〜255) |
| 2^9 | 512 | 200 | 旧来のセクタサイズ512バイト |
| 2^10 | 1,024 | 400 | 1KiB(キビバイト) |
| 2^11 | 2,048 | 800 | 2KiB |
| 2^12 | 4,096 | 1000 | ページサイズ4KiB、4Kセクタ |
| 2^13 | 8,192 | 2000 | 8KiB |
| 2^14 | 16,384 | 4000 | 16KiB |
| 2^15 | 32,768 | 8000 | 符号つき16bitの上限(32767)+1 |
| 2^16 | 65,536 | 10000 | ポート番号の数、符号なし16bitの通り数 |
2の累乗は16進数にすると1・2・4・8・10・20・40・80…と規則的に並びます。ダンプを眺めていて「80」「100」「1000」がよく出てくるのは、この切りのよさが理由です。
負の数と2の補数
コンピュータのレジスタは桁数が決まっています。その決まった桁の中で負の数を表す標準的な方法が2の補数です。考え方は「足すと桁あふれして0になる値を、その数のマイナスとみなす」。
1. 5 は 00000101
2. 全ビットを反転: 11111010
3. 1を足す: 11111011(10進数では251、16進数ではFB)
検算: 00000101 + 11111011 = 100000000 → 9桁目は8ビットに入らず捨てられ、残りは00000000
| ビット数 | 符号つきで表せる範囲 | -5 の2の補数 | -1 の2の補数 |
|---|---|---|---|
| 8bit | -128 〜 127 | 11111011 (FB) | 11111111 (FF) |
| 16bit | -32,768 〜 32,767 | FFFB | FFFF |
| 32bit | -2,147,483,648 〜 2,147,483,647 | FFFFFFFB | FFFFFFFF |
この方式の利点は、引き算を足し算の回路で処理できることです。7 − 5 を「7 + (−5)」として同じ加算器に通せるので、CPUに減算専用の回路を持たせずに済みます。上のツールに負数を入れると、8bit・16bit・32bitの2の補数を同時に表示します。
最上位ビットが1なら負、というのは符号つきとして読む場合の話です。同じ11111011を符号なしで読めば251。デバッガの表示が-5だったり4294967291だったりするのは、同じビット列をどちらの約束で読んだかの違いです。
小数の2進数(0.1が割り切れない理由)
整数と同じように、小数部にも右へ 2-1=0.5、2-2=0.25、2-3=0.125 … の重みが並びます。この足し算で作れる小数だけが割り切れます。
整数部 10 は 1010。小数部 0.25 は 0×0.5 + 1×0.25 なので「01」。あわせて 1010.01 です。0.5・0.25・0.125・0.75 のように分母が2の累乗になる小数はきれいに終わります。
0.1 は 1/10 で、分母の10には2で割り切れない因数5が含まれます。そのため 1/2 + 1/4 + 1/8 … をどう組み合わせても作れず、0011 が無限に繰り返します。10進数で 1/3 が 0.333… になるのと同じ理由です。
これが、多くの言語で 0.1 + 0.2 が 0.30000000000000004 になる原因です。金額のようにずれてはいけない値は、小数のまま持たずに最小単位の整数(円やセント)で持つのが定石です。本ツールは小数部を最大16桁まで計算し、そこで終わらない場合は打ち切った旨を表示します。
文字と16進数(UTF-8)
文字はまず番号(符号位置)に置き換えられ、その番号をUTF-8などの方式でバイトの並びに直してから保存・送信されます。1バイトを16進数2桁で書くので、ダンプでは16進数が並びます。
| 文字 | 符号位置 | UTF-8のバイト列(16進数) | バイト数 |
|---|---|---|---|
| A | U+0041 (65) | 41 | 1 |
| a | U+0061 (97) | 61 | 1 |
| 0 | U+0030 (48) | 30 | 1 |
| (半角空白) | U+0020 (32) | 20 | 1 |
| あ | U+3042 (12354) | E3 81 82 | 3 |
| 漢 | U+6F22 (28450) | E6 BC A2 | 3 |
| 改行(LF) | U+000A (10) | 0A | 1 |
ASCIIの範囲(U+0000〜U+007F)はUTF-8でも1バイトで、番号がそのまま16進数2桁になります。半角英数字が16進数で 30〜39(数字)・41〜5A(大文字)・61〜7A(小文字)に並ぶのはそのためです。日本語はUTF-8で3バイトが基本なので、全角1文字=3バイトとして容量を見積もります。
同じ「あ」でも、Shift_JISなら82 A0、UTF-16なら30 42と別のバイト列になります。文字化けの原因を追うときは「どの方式でバイト列に直したか」と「どの方式で読み戻したか」の食い違いを疑ってください。本ツールの文字モードはUTF-8として扱います。
よくある質問
なぜコンピュータは2進数で動くの?
電子回路が確実に区別できる状態が「電圧が高い/低い」の2つだからです。10段階の電圧を使い分ける回路も理屈では作れますが、わずかなノイズや温度変化で隣の値と取り違えます。0と1の2つだけなら判定に余裕があり、AND・OR・NOTといった論理演算もスイッチの組み合わせでそのまま実現できます。速く・安く・壊れにくく作れることが2進数が選ばれた理由で、記憶装置も「磁化の向き」「電荷があるかないか」と2状態のほうが単純に作れます。
16進数の1桁が2進数4桁にあたるのはなぜ?
16が2の4乗だからです。2進数4桁で表せるのは0000〜1111の16通りで、これが16進数の0〜Fに1対1で対応します。だから2進数を右から4桁ずつ区切り、各かたまりを1文字に置き換えるだけで変換でき、繰り上がりを考える必要がありません。11111111なら1111と1111でFとF、つまりFF。1バイト=8ビットが16進数ちょうど2桁になるので、メモリダンプやカラーコード(#FF8800)で16進数が使われます。
2の補数はどういう考え方?
決まった桁数の中で「足すとちょうど桁あふれして0になる値」を負の数として使う方法です。8ビットなら-5は256-5=251、つまり11111011。5(00000101)と足すと9桁目に繰り上がり、その桁は8ビットに収まらず捨てられるので結果は00000000になります。求め方は「全ビットを反転して1を足す」。この方式なら引き算を足し算の回路でそのまま処理でき、0の表し方も1通りに定まります。
0.1を2進数にすると割り切れないのはなぜ?
2進数の小数は1/2、1/4、1/8…の足し算でしか表せず、1/10はどう組み合わせても作れないからです。0.1は0.000110011001100…と0011が無限に続きます。10進数で1/3が0.333…になるのと同じで、分母に底の素因数(2進数なら2以外、ここでは5)が残ると循環します。これが0.1+0.2が0.30000000000000004になる原因で、金額など誤差が許されない値は円単位の整数で扱うのが定石です。0.5や0.25、10.25は割り切れます。
8進数は今でも使う?
使います。もっとも身近なのはLinuxやmacOSのファイル権限で、chmod 755 の755が8進数です。読み取り4・書き込み2・実行1を足して1桁になり、所有者・グループ・その他で3桁。2進数3桁(rwx)が8進数1桁にちょうど収まる性質を利用しています。755なら 7=111(rwx)、5=101(r-x)。ほかにC言語系の0から始まる数値リテラルや、一部の機器の設定値でも見かけます。
文字と16進数はどう対応している?
文字は番号(符号位置)に置き換えられ、その番号をUTF-8などの方式でバイト列に直したうえで、1バイトを16進数2桁で書きます。半角のAは番号65、UTF-8では1バイトで16進数41。「あ」は番号12354でUTF-8では3バイト、E3 81 82です。同じ文字でもShift_JISやUTF-16では別のバイト列になるため、文字化けの調査では方式もあわせて確認してください。本ツールの文字モードで両方向を確認できます。
36進数のような大きな進数は何に使う?
0〜9とA〜Zの36文字をすべて桁として使えるので、短い文字列でIDを表したいときに使われます。同じ値でも10進数より桁数が減るため、URLの短縮IDや一部のシリアル番号で見かける形式です。本ツールは2〜36の任意の進数に対応しているので、11進数や20進数のような学習用の課題にも使えます。10以上の桁はA=10、Z=35として扱います。
本ツールの計算は任意精度の整数演算で行っており、大きな値でも桁落ちしません。小数部は最大16桁で打ち切り、打ち切った場合はその旨を表示します。