ツール
ガイド

基数変換

変換

BigInt で 2〜62 進法を相互変換。巨大な整数も精度を落としません。

100% クライアントサイド バックエンドなし
→
出力
10 進
このページの内容

基数変換ツールとは?#

どの整数も値そのものは同じで、表記が基数によって変わるだけです。10 進の 255、16 進の ff、2 進の 11111111、8 進の 377 は、どれも同じ数の 4 つの文字列表現です。基数変換ツールはある表記を別の表記に翻訳します。これを単なる parseInt で済ませず専用ツールにする理由は、JavaScript の Number が 2^53(約 10 進 16 桁)を超えるとサイレントに精度を落とすため、18446744073709551616 のような 64 ビット識別子を素の Number で変換すると、警告なしに別の数が返ってくるからです。

本ページは最初から最後まで BigInt ベースなので、任意サイズの整数がすべての変換で全精度を保ちます。2 進から 62 進までをサポートし、標準的な数字アルファベット 0-9、続いて a-z、そして A-Z を使います。便宜上、2 進から 36 進までは大文字小文字を区別しません(16 進の 255 に FF と入力できます)。一方 37 進から 62 進までは大文字小文字を区別します。62 進法では小文字 a と大文字 A が実際に異なる 2 つの数字(10 と 36)だからです。

使い方#

  1. 変換したい値を入力します。初期値は 255 です。
  2. 変換元の基数を、値が現在書かれている基数に設定します(ドロップダウンは 2〜62 を提供、デフォルトは 10 進)。
  3. 変換先の基数を、欲しい基数に設定します(デフォルトは 16 進)。両者の間の矢印は単なる視覚的な目安です。
  4. 出力欄に変換後の表記がリアルタイムで表示され、その下の10 進の行に同じ値の 10 進表現が示されます。見慣れない基数同士を変換する際の便利な妥当性チェックになります。
  5. サンプルでデフォルトを再読み込み、クリアで入力欄を空にできます。選んだ基数に対して不正な数字を入力するとステータス行で報告されます(8 進に 8、16 進に g を入れても、暗黙にデタラメな結果は出ません)。

主な機能#

  • BigInt の精度。 変換は任意精度整数で行われるため、2^64 以上の値も正確にラウンドトリップします。2^53 の崖も浮動小数点の近似もありません。
  • 2 進から 62 進まで。 2 進・8 進・10 進・16 進・base32・base36・base58 系のアルファベット・完全な base62 までをカバーし、実システムが実際に使う範囲を網羅します。
  • 大文字小文字を考慮した解析。 2 進〜36 進は利便性のため大文字小文字を区別しません。37 進〜62 進は大文字小文字を区別し、a と A を別々の数字として扱います。これは標準的な 62 記号アルファベットと一致します。
  • 桁区切りのアンダースコアを許容。 1_000 を貼り付けると 1000 として読まれます。多くのプログラミング言語が可読性のために使う慣習と同じです。
  • 符号対応。 負の値も正しく変換され、マイナス記号はすべての基数で保持されます。

実例#

デフォルトの 255、変換元 10、変換先 16 で、パネルは次を示します。

Output:   ff
Decimal:  255

変換先を 2 に切り替えると 11111111 になります。8 ビット、ちょうど 1 バイトに収まる値であり、だからこそ ff がカラーコードやバイトダンプでおなじみの姿なのです。

BigInt が必要になる本当の理由は 64 ビット値で現れます。18446744073709551616(= 2^64)を入力、変換元 10、変換先 16 にします。

Output:   10000000000000000
Decimal:  18446744073709551616

これは 1 のあとにゼロが 16 個並んだもので、2^64 を 16 進で表した値です。JavaScript の Number で作った変換器なら、入力を 18446744073709552000 に丸めてから処理を始め、誰も気づかないでしょう。変換元 16/変換先 10 でラウンドトリップすると、元の 10 進値がそのまま戻ります。これが精度損失がないことの証明です。

よくある質問#

なぜ FF は 16 進で通るのに base 62 ではダメなのですか?#

2 進〜36 進は 1 つの文字範囲(a〜z、10〜35 に対応)を共有するため、大文字小文字は関係なく FF = ff = 255 です。37 進以上になるとアルファベットは 26 文字では足りなくなり、大文字に拡張します。a=10、b=11 … z=35、A=36、B=37 … Z=61。両方のケースが使われる時点で a と A は別の数字になるため、パーサーはケースを保持しなければなりません。

その基数で無効な数字を入力したらどうなりますか?#

デタラメな答えではなく明確なエラーになります。変換元を 8(8 進)にして 8 や 9 を入れたり、変換元を 16(16 進)にして g を入れたりすると、それらの文字はその基数の合法な数字ではないため拒否されます。ステータス行が問題の文字を教示します。

ほかの基数に変換しているのに 10 進の行を表示するのはなぜですか?#

人間は 10 進で考えるため、これが自然な妥当性チェックになるからです。base58 の q を base16 に変換して 1a になったとき、10 進の行(26)を見れば「確かに 58 番目付近の記号は 26 を意味していた」と、自分で計算せずに確認できます。

3.14 のような小数には対応していますか?#

いいえ。本変換器は整数のみを扱います。小数部分の基数変換は別の問題であり(大半の基数で無限に循環する展開になります。10 進の 1/3 のように)、これを黙って打ち切ると誤解を招きます。任意サイズの整数値なら、変換は正確かつ瞬時です。