進数変換ツール
バイナリ、8進数、10進数、16進数の間で変換します。
数値基数を理解する
数値基数(またはradix)は、数を表すために使用される一意の桁の数を決定します。最も馴染みがあるのは10進数(decimal)で、0〜9の桁を使用します。コンピューターは、0と1のみのバイナリ(基数2)をネイティブに使用します。
- バイナリ(基数2): すべてのデジタルシステムで内部的に使用されます。各桁は「ビット」です。
- 8進数(基数8): 0〜7の桁を使用します。Unixファイル権限(例: chmod 755)で一般的です。
- 10進数(基数10): 標準的な人間の数値システム。
- 16進数(基数16): 0〜9とA〜Fを使用します。色(#FF0000)、メモリアドレス、バイト表現で広く使用されます。
よくある質問
非常に大きな数値をサポートしていますか?
はい。このツールはJavaScriptのBigIntを使用しており、精度を失うことなく任意の大きな整数をサポートします。数百桁の数値を変換できます。
なぜバイナリがコンピューティングで重要なのですか?
コンピューターは、バイナリ(1/0)に自然にマップされる2つの状態(オン/オフ)を持つ電気信号を使用します。テキスト、画像、ビデオなど、あらゆるデータは最終的にバイナリで保存および処理されます。
位置記数法の仕組み
位置記数法は、固定サイズの数字記号セットを使って数を表す。各桁の位置がその重みを決める。位置i(右から数えてゼロから始まる)の重みは base^i だ。数の値は全位置の digit × base^i の和だ。10進数での文字列 352 は 3×100 + 5×10 + 2×1 = 352 を意味する。2進数での文字列 1011 は10進数で 1×8 + 0×4 + 1×2 + 1×1 = 11 を意味する。
位置記数法は数の表現における2大発明のひとつだ。もう一方は非位置記数法(ローマ数字、エジプト神官文字)で、記号が位置に関わらず固定の値を持つ。位置記数法は圧縮できるが、非位置記数法はできない。1,888は10進数では4桁だが、ローマ数字では8文字:MDCCCLXXXVIIIとなる。
基数の小史
バビロニア人は少なくとも古バビロニア時代(紀元前1900〜1600年頃)から位置記数法の60進法(六十進法)を使っていた。その時代の楔形文字の粘土板にはすでに位置記数法が使われている。なぜ60か?小さな約数が非常に多い(1、2、3、4、5、6、10、12、15、20、30、60)ため、小数を表現できなかった時代に分数の計算が容易だった。バビロニアの遺産は今も身近に残っている:時間(1分60秒、1時間60分)と角度・地理座標(円周360度、1度60分、1分60秒)はその直接の子孫だ。時計を読んだり緯度を確認したりするとき、あなたは六十進法を読んでいる。
現在知られる10進位置記数法はインドの数学者によって西暦初期の数世紀に開発された。それ以前の計算板と区別する概念的飛躍は位取りとしてのゼロの書き記された記号だ。位置記数法の文脈でゼロが使われた最古の明確な例は一般にブラーマグプタ(628年)に帰せられる。その著書Brāhmasphuṭasiddhāntaはゼロを用いた算術の規則を示した。バクシャリー写本はそれよりもさらに早い、位取り記号としての点(bindu)の使用を示している。
10進法は8〜9世紀にインドからイスラム世界へ伝わった。ペルシャの万能学者al-Khwārizmīは825年頃にインド数字による計算についてを著した(「アルゴリズム」と「代数」は彼の名前と著書名の語源の直接の子孫だ)。ヨーロッパは遅れた。ピサのレオナルド(フィボナッチとして知られる)はLiber Abaci(1202年)でラテンヨーロッパにヒンドゥー・アラビア数字を正式に紹介し、ローマ数字より優れていることを実証した。ローマ数字は16世紀までヨーロッパの帳簿付けに残存した。
ゴットフリート・ヴィルヘルム・ライプニッツは1703年の論文Explication de l'arithmétique binaireで完全な2進数システムを記述した。もっとも主な動機は実用的というよりも哲学的なものだった(易経との対応)。2進数コンピューティングへの飛躍はクロード・シャノンの1937年のMIT修士論文「リレー回路と開閉回路の記号解析」によってもたらされた。ブール代数が電気リレーネットワークをモデル化できることを示し、2進法をデジタル論理の自然言語とした。
変換アルゴリズム
10進数から他の基数へ:繰り返し除算。10進整数Nを基数bに変換するには、Nをbで割り、余りを記録し、Nを商に置き換えて商が0になるまで繰り返す。余りを下から上に読むと基数bの桁が得られる。156を2進数に変換する例:156÷2 = 78 r0、78÷2 = 39 r0、39÷2 = 19 r1、19÷2 = 9 r1、9÷2 = 4 r1、4÷2 = 2 r0、2÷2 = 1 r0、1÷2 = 0 r1。余りを下から読むと 10011100。検証:128 + 16 + 8 + 4 = 156。
他の基数から10進数へ:ホーナー法。0から始めて、左から右へ各桁ごとに、実行合計に基数を掛けて新しい桁を加える。16進数 1F4 の例:0×16 + 1 = 1、次に1×16 + 15 = 31、次に31×16 + 4 = 500。
どちらのアルゴリズムも桁数に対して線形時間で実行される。JavaScriptの BigInt はこれを内部実装しており、このツールに精度上限がない理由だ。200桁の数も丸め誤差なく任意の2つの基数間で変換できる。
コンピューティングで重要な4つの基数
- 2進数(基数2):トランジスタはオンかオフなので、2進数はデジタル論理の自然な表現だ。すべてのデータは突き詰めれば2進数だ。
- 8進数(基数8):3ビットが1桁の8進数に対応するため、初期コンピューティングで一般的だった。今日では目立たないが、Unixファイルパーミッション(
chmod 755)や一部のレガシーファイル形式で今も使われる。 - 10進数(基数10):日常的な人間の数体系で、おそらく指が10本あるからだ。金融システム、科学、人間が数を読む場所ならどこでも使われる。
- 16進数(基数16):1桁がちょうど4ビット、つまり1バイト = 2桁の16進文字だ。バイトレベルのコンパクト表現の事実上の標準:16進カラーコード(
#FF0000)、メモリアドレス(0x7fff...)、Unicodeコードポイント(U+1F600)、MACアドレス、ハッシュダイジェスト。
覚えておく価値のある2のべき乗
| べき乗 | 10進数 | 16進数 | 重要な理由 |
|---|---|---|---|
| 2⁸ | 256 | 0x100 | 1バイト;8ビットチャンネルの最大値(RGB) |
| 2¹⁰ | 1,024 | 0x400 | コンピューティングでの「1K」 |
| 2¹⁶ | 65,536 | 0x10000 | UTF-16 BMPサイズ;16ビット整数の最大値 |
| 2²⁰ | 1,048,576 | 0x100000 | コンピューティングでの「1M」 |
| 2²⁴ | 16,777,216 | 0x1000000 | 24ビットRGB(「1670万色」) |
| 2³² | 約43億 | 0x100000000 | 32ビット符号なし整数の最大値;IPv4アドレス空間 |
| 2⁶⁴ | ~1.8×10¹⁹ | 0x100… | 64ビット整数の最大値;浮動小数点の精度をはるかに超える |
基数変換を使う場面
- デバッガー、ネットワークパケットキャプチャ、バイナリファイルの16進ダンプを読む。
0xFFを255に暗算するのは問題ないが、0x7F4Aはたいていできない。 - CSSカラーコード:
#FF0000は10進数で (255, 0, 0) だ。16進→RGB変換は2文字ペアごとに基数16から基数10に変換するだけだ。 - Unixファイルパーミッション:
chmod 755は8進数:7 = rwx(読み取り+書き込み+実行 = 4+2+1)、5 = r-x(読み取り+実行 = 4+1)、もう一つの5も同様。8進数の各桁はちょうど3ビットだ。 - IPv4オクテット:
192.168.1.1のようなアドレスは8ビット数が4つだ。サブネットマスクは2進数で理解しやすい(/24マスクは1が24個続いた後に0が8個)。 - Unicodeコードポイント:文字は16進数でカタログ化されている(♥はU+2665、😀はU+1F600)。10進数の等価値も存在するが、16進形式がUnicode表と一致する。
- ビットマスク演算:機能フラグ、パーミッションビット、ハードウェアレジスタ値はすべて10進数より2進数または16進数で読みやすい。
- アセンブリや逆アセンブルされたコードのデバッグ:アドレス、オペコード、即値は慣例的に16進数で書かれる。
知っておく価値のあるその他の基数
- 基数36:特殊文字なしで英数字に収まる最高の基数(10桁 + 26文字)。短縮URLハッシュや一部のエンコード方式に使われる。JavaScriptの
Number.toString(36)は直接公開している。 - 基数58:BitcoinとRippleアドレスに使用。混同しやすい
0(ゼロ)、O(大文字O)、I(大文字I)、l(小文字l)を省き、手書き転記エラーに対してアドレスを堅牢にする。 - 基数62:完全英数字(数字 + 小文字 + 大文字)。URL短縮サービスのスラッグに一般的(
example.com/abc123の「abc123」部分)。 - 基数64:テキストのみのチャンネル(メール、JSON、URL)で転送するためにバイナリデータを印刷可能なASCIIとしてエンコードする。このツールとはスコープが異なり、整数ではなくバイトストリームを対象とする。
ソースコードのプレフィックス規約
最新の言語のほとんどは、ソースコードで基数を明確にするために同じリテラルプレフィックスセットを使用する:
- 2進数:
0bまたは0B(Python、Ruby、Java 7以降、C++14以降、ES6以降のJavaScript、Rust)。例:0b10011100。 - 8進数:
0oまたは0O(Python 3、ES6、Rust)。古いC系言語は先頭ゼロ(0755)を使うが、誤って10進数に先頭ゼロをつけると意図しない解釈になる落とし穴がある。 - 16進数:
0xまたは0X:事実上すべてのプログラミング言語で普遍的に理解される。 - 10進数:プレフィックス不要。
よくある質問
負の数はどう扱いますか?
コンピューターは2の補数を使って負の整数を表現する:すべてのビットを反転して1を加える。8ビットの2の補数では、−1は 11111111(0xFF)、−5は 11111011(0xFB)、−128は 10000000(0x80)だ。最上位ビットが符号を示す。このツールは2の補数表現ではなく先頭のマイナス符号で負の整数を表示する。2の補数は固定のビット幅でのみ意味を持つが、ツールは任意精度の BigInt を使用するため解釈すべき固定幅がないからだ。
16進数がA〜Fを使う理由は?
基数16には16の異なる桁記号が必要で、10進数字0〜9は10しか提供しない。10〜15にA〜F(大文字小文字区別なし)を使う慣習は1960年代のIBM System/360によって普及し、業界全体で標準化された。初期のシステムは他のグリフを試みた(BendixのG-15はu、v、w、x、y、zを使った)が、A〜Fが勝った。
このツールは分数を扱えますか?
いいえ、整数のみだ。分数の基数変換はより複雑で、ほとんどの10進分数は2進数に正確な表現を持たない(有名な 0.1 + 0.2 ≠ 0.3 浮動小数点問題)。浮動小数点のビットレベル検査には専用のIEEE 754ビジュアライザーが適切なツールだ。
何かサーバーに送信されますか?
いいえ。変換はブラウザ内でJavaScriptネイティブの BigInt 演算を使って実行される。入力に関する情報はページから出ない;ツールは読み込み後オフラインで動作する。