進法とは? 位取りの読み方
進法とは、1つの桁がいくつの値を取れるか(基数)によって、桁が1つ上がるごとに値が何倍になるかを決める約束です。 10進数の「253」は 2×102 + 5×101 + 3×100 です。2進数の「1101」も同じ読み方で、 1×23 + 1×22 + 0×21 + 1×20 = 8 + 4 + 0 + 1 = 13 になります。どの進法でも「各桁の数字 × 基数の桁数乗」を足せば 10進数の値が得られます。下の計算過程に出てくる「位取りの展開」がこの計算です。
逆に10進数をN進数に直すには、Nで割り続けて、余りを最後から順に読みます。13を2で割ると商6余り1、6÷2は商3余り0、3÷2は商1余り1、 1÷2は商0余り1なので、余りを逆順に並べて1101になります。逆順になるのは、最初に求まる余りがいちばん下の桁(1の位)だからです。
0〜16の対応表
| 10進数 | 2進数 | 8進数 | 16進数 |
|---|---|---|---|
| 0 | 00000 | 0 | 0 |
| 1 | 00001 | 1 | 1 |
| 2 | 00010 | 2 | 2 |
| 3 | 00011 | 3 | 3 |
| 4 | 00100 | 4 | 4 |
| 5 | 00101 | 5 | 5 |
| 6 | 00110 | 6 | 6 |
| 7 | 00111 | 7 | 7 |
| 8 | 01000 | 10 | 8 |
| 9 | 01001 | 11 | 9 |
| 10 | 01010 | 12 | A |
| 11 | 01011 | 13 | B |
| 12 | 01100 | 14 | C |
| 13 | 01101 | 15 | D |
| 14 | 01110 | 16 | E |
| 15 | 01111 | 17 | F |
| 16 | 10000 | 20 | 10 |
16進数の1桁は2進数の4ビットにぴったり対応し、8進数の1桁は3ビットに対応します。そのため2進数から16進数への変換は、計算なしで4桁ずつに区切って表から探すだけです。 たとえば 1011 0101 は B と 5 なので B5 です。逆に16進数の各桁を4ビットに展開すれば2進数になります。
なぜコンピュータは2進数を使うのか
電子回路は、電圧が高いか低いかのように、はっきり区別できる2つの状態を扱うのが最も安定しているため、0と1の2進数が基本になっています。 ただし2進数は桁が長く、人が読むのには向きません。そこでメモリアドレス、エラーコード、色コードには4ビットを1文字にまとめられる16進数を、 Unixのファイル権限には3ビットを1文字にまとめられる8進数を使います。1,000は2進数で1111101000(10桁)、8進数で1750、16進数で3E8と、だんだん短くなります。
2のべき乗の表
ビルド時にBigIntで計算した値なので、253を超えても正確です。
| 指数 | 10進数 | 16進数 |
|---|---|---|
| 2^0 | 1 | 1 |
| 2^1 | 2 | 2 |
| 2^2 | 4 | 4 |
| 2^3 | 8 | 8 |
| 2^4 | 16 | 10 |
| 2^5 | 32 | 20 |
| 2^6 | 64 | 40 |
| 2^7 | 128 | 80 |
| 2^8 | 256 | 100 |
| 2^10 | 1,024 | 400 |
| 2^12 | 4,096 | 1000 |
| 2^16 | 65,536 | 10000 |
| 2^20 | 1,048,576 | 100000 |
| 2^24 | 16,777,216 | 1000000 |
| 2^31 | 2,147,483,648 | 80000000 |
| 2^32 | 4,294,967,296 | 100000000 |
| 2^53 | 9,007,199,254,740,992 | 20000000000000 |
| 2^63 | 9,223,372,036,854,775,808 | 8000000000000000 |
| 2^64 | 18,446,744,073,709,551,616 | 10000000000000000 |
28 = 256 は1バイトで表せる値の個数(0〜255)、216 = 65,536 はポート番号の個数(0〜65535)です。JavaScriptの通常の数値は64ビット浮動小数点数で、 整数を正確に表せるのは 253 − 1 = 9,007,199,254,740,991 までです。それを超えると表せない整数が出てくるため、この変換ツールはBigIntで計算します。
精度・負の数・小数の扱い
- 大きな整数: 入力した桁をBigIntに積み上げて計算するため、ツール側の桁数制限はなく、結果は正確です。数千桁を超えるような入力ではブラウザが重くなることがあります。
- 負の数: どの欄でも先頭の - を受け付けます。符号つきの数として変換するので、-255 は2進数で -11111111、16進数で -FF になります。
- 小数は非対応: 小数点は使える文字に含まれないため、0.1 のような値は「使えない文字」と表示されます。0.1 は2進数では循環して終わらず、浮動小数点の誤差の原因になりますが、このツールは整数だけを扱います。
- 接頭辞: 各欄では 0b・0o・0x(それぞれ2進数・8進数・16進数)を自動で取り除き、空白とアンダースコアも無視するので、1111_0000 のように入力できます。
- 計算過程の表示: 位取りの展開は16桁以内の入力で表示し、割り算の表は非常に大きな数では40段階までで打ち切ります。
負の数と2の補数
コンピュータは負の整数を多くの場合2の補数で保存します。nビットで -x は 2n − x として表します。8ビットでは -1 が 256 − 1 = 255 = 11111111(16進数 FF)、 -128 が 10000000(80)、+127 が 01111111(7F)です。同じビット列 FF が、符号なしとして読めば255、符号つきとして読めば -1 になるように、ビット列はビット幅と符号の有無を決めないと意味が定まりません。 上のツールに負の数を入れると8・16・32・64ビットの表現が並び、その範囲に収まらないビット幅の行は表示されません。
| ビット幅 | 符号つきの最小 | 符号つきの最大 | 符号なしの最大 |
|---|---|---|---|
| 8ビット | -128 | 127 | 255 |
| 16ビット | -32,768 | 32,767 | 65,535 |
| 32ビット | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 |
| 64ビット | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 |
実務での使いどころ: 色コードとchmod
Webの色 #FF8800 は、赤・緑・青の各バイト FF、88、00 を並べたもので、10進数では赤255、緑136、青0です(0x88 = 8×16 + 8 = 136)。 ファイル権限の 755 は8進数として読み、各桁は読み取り r=4、書き込み w=2、実行 x=1 の合計です。
| 8進数 | 2進数 | 権限 |
|---|---|---|
| 0 | 000 | --- |
| 1 | 001 | --x |
| 2 | 010 | -w- |
| 3 | 011 | -wx |
| 4 | 100 | r-- |
| 5 | 101 | r-x |
| 6 | 110 | rw- |
| 7 | 111 | rwx |
たとえば chmod 755 は、所有者が7(rwx)、グループが5(r-x)、その他が5(r-x)で rwxr-xr-x となり、2進数では 111 101 101 です。 chmod 644 は rw-r--r-- で、書き込めるのは所有者だけ、全員が読み取れます。
検算した計算例
- 2進数 → 10進数: 10110101 は 128 + 32 + 16 + 4 + 1 = 181 で、16進数では B5 です(1011 = B、0101 = 5)。
- 16進数 → 10進数: 16進数の 1F4 は 1×256 + 15×16 + 4 = 500 です。
- 8進数 → 2進数: 8進数の 755 は 111 101 101 です。各桁を3ビットに展開します。
- 36進数: 36進数の ZZ は 35×36 + 35 = 1,295 です。逆に3,000を36で割ると商83余り12(C)、83を36で割ると商2余り11(B)なので、3,000は36進数で 2BC です。
- 大きな数: 9,007,199,254,740,993 は16進数で 20000000000001 です。JavaScriptの通常の数値で扱うと 9,007,199,254,740,992(16進数で 20000000000000)に丸められてしまいますが、このツールはBigIntで末尾の桁まで正確に変換します。
- 2の補数: -100 の8ビット表現は 256 − 100 = 156 = 9C。-1 の32ビット表現は FFFFFFFF です。200 は符号つき8ビット(-128〜127)に入らないため8ビットの行は表示されず、16ビットの行に 00C8 が出ます。
よくある間違いと限界
- 16進数の大文字・小文字: a〜f と A〜F は同じ値です。出力は大文字にそろえます。
- 紛らわしい文字: 数字の0とアルファベットのO、数字の1と小文字のlの取り違えで、無効な入力になることがよくあります。エラーでは何文字目が問題かを表示します。
- 進法に合った数字: 2進数には0と1だけ、8進数には0〜7だけが使えます。2進数の欄に2を入れると拒否されます。
- 文字コードの変換とは別: このツールは数の書き方を変えるものです。文字をASCIIやUnicodeのコードに直す作業とは別の処理です。
- ビット幅の指定: ビット幅を決めないと、FFの例のように、同じビット列が複数の値を表しうる点に注意してください。
結果の活用方法
- 色コードやメモリアドレスを10進数に直してコードに書く、10進数の値を16進数に直してデバッガの表示と照らし合わせる、といった使い方ができます。
- ビットマスクを設計するときは、値を入れて2進数の欄を見れば、どのビットが立つかを確認できます。
- 授業や試験の問題では、自分の計算を位取りの展開や割り算の過程と見比べて確認しましょう。
- URLの短縮コードのような英数字の短い識別子は、36進法で表すと10進数より桁数が短くなります。
よくある質問
負の数や小数も変換できますか?
負の整数は先頭に - を付ければ変換でき、8・16・32・64ビットの2の補数表現も表示されます。小数点には対応しておらず、整数のみ扱います。
なぜ36進法まで対応しているのですか?
36進法は0〜9とA〜Z(10〜35)をすべて使う、数字と英字だけで書ける最大の進法です。URL短縮や短い識別子の生成などで使われるため、対応しています。
とても大きな数も正確に変換されますか?
はい。JavaScriptの通常の数値は約9×1015(253)を超えると整数が不正確になりますが、このツールはBigIntで計算するため、桁数の上限は設けていません。ただし数千桁を超える入力ではブラウザが遅くなることがあります。
0xや0bが付いた値をそのまま貼り付けてもよいですか?
対応する欄ならそのまま入力できます。0x(16進数)、0b(2進数)、0o(8進数)は自動的に取り除かれ、空白とアンダースコアも無視されるので、1111_0000 のような書き方も使えます。
16進数の1桁がなぜ4ビットなのですか?
16 = 24 だからです。16進数の1桁は0〜15で、4ビットが取れる16通りの値と一対一に対応します。同じ理由で、8進数の1桁は3ビット、32進数の1桁は5ビットに対応します。
2の補数の表に出ないビット幅があるのはなぜですか?
その値を収められるビット幅だけを表示するためです。たとえば200は符号つき8ビットの範囲(-128〜127)に入らないので、表は16ビットから始まります。
あわせて使いたいツール
- カラーコード変換: HEX・RGB・HSLなどの相互変換
- Base64エンコーダー/デコーダー: バイト列を文字で表すもう一つの方法
- ローマ数字変換ツール: 位取りを使わない記数法
- ポート番号総まとめ: 0〜65535の範囲の実際の使われ方
このツールは学習と開発の参考用です。暗号やセキュリティに関わる値は、実績のあるライブラリと公式の仕様で必ず確認してください。