初めて基本的な変換で夜の仕事が犠牲になりましたが、その原因はパーミッションのバグでした。 デプロイ スクリプトは、ファイル モードを次のように記述しました。 chmod 755、および構成ローダーは、JSON ファイルから数値と同じ値を読み取ります。 755。 JSON には、8 進数のリテラルはありません。 ローダーが合格した 755 8 進数モードを想定した SYSCAL に対して、モードは 10 進数 755 と解釈され、バイナリの 10 進数 755 は 10 進数です。 1011110011ー 9 ビットフィールドに10 ビットものナンセンスが 含まれていました ファイルは結局 誰も要求しなかったアクセス許可が 付き 誰も説明できませんでした。
それが、実際には基本的な混乱のように見えます。 難しい数学の問題はほとんどありません。 これは、ある表記法では正しく、別の表記法では壊滅的な値であり、誰も意図した基準を書き留めた境界を越えて移動します。 2 進、8 進、10 進、16 進数は、同じ整数を書き込む 4 つの方法で、コンピューターを使用すると、喜んでそれらを混同できます。
ということで、私は ナンバーベースコンバータ で Toolz.dev その瞬間に私が実際に到達すること: 値を貼り付け、それがどの基数にあるかを言い、他のすべての基数に一度に見ます - ビット数、バイト数、およびニブルでレイアウトされたバイナリとともに、その上の 16 進数と一致するように 2 から 36 までの任意の基数を処理し、受け入れます 0x、 0b、そして 0o 接頭辞であり、BIGINT でその算術のすべてを実行するため、256 ビットのハッシュは、静かにガベージに丸めるのではなく、正確に変換します。
tl;dr: A number' s value never changes when you convert it - only the notation does. (数値は変換しても決して変わらない) - 表記だけが変わる ナンバーベースコンバータ 2 から 36 までの任意の底辺の間で整数を変換し、2 進数、8 進数、10 進数、16 進数を同時に表示し、ビットとバイト長を報告し、bigint を使用して任意のサイズで精度を保持し、すべてのブラウザーで実行します。
主な機能
2から36までの任意のベース
バイナリ、オクタル、デシマル、ヘキサデシマルは、実際のコードに表示される4 つであるため、専用のショートカットボタンを取得します。 しかし、ソースドロップダウンとターゲットドロップダウンは、ベース2 からベース36 までの全範囲を実行します - 天井は、大文字と小文字を区別しない英数字 (10 桁プラス26 文字) がなくなる点です。 ベース3、ベース12、ベース20、ベース32、およびベース36 はすべてワンクリックで、それぞれが標準でレンダリングされます 0-9A-Z 数字のアルファベット。
正確な BIGINT 算術演算
これは最も重要な機能であり、マーケティング コピーでは最も重要ではありません。 JavaScript 番号は IEEE-754 doubles であり、2^53 − 1 までの整数のみを表し、9,007,199,254,740,991 です。 それを過ぎて、 parseInt あんど Number 丸め始めます - 静かに、エラーなしで、もっともらしく見え、間違っている値を生成します。 web 上のほとんどのベース コンバータは、まさにそれらの関数に基づいて構築されています。
これは、数字を桁ごとに解析して BigInt アキュムレータ (value = value * base + digit) と繰り返し除算によってレンダリングを戻す。 precision ceiling はない。 64 ビットID、256 ビットハッシュ、RSAモジュラス、500 桁の小数 - すべて正確に変換する。
すべての拠点を一度に
1 つの入力、4 つの出力、ライブ。パネルには、バイナリ、8 進数、10 進数、16 進数が同時に表示され、さらに、それらの 4 つのいずれでもない場合は選択したカスタム ベースが表示されます。ほとんどの基本変換は実際にはクロスチェックです。デバッガーの 16 進数とログ行の 10 進数が同じ数であることを確認する必要があります。そして、4 つすべてを一度に確認すると、3 段階のタスクが一目でわかります。
ビット長、バイト長、ニブルグループ
人々がバイナリに変換される理由は、通常、ビットについての好奇心ではありません。これはサイジングの問題です。これは、32 ビットの int で、符号付きの短編で 1 バイトに収まるのでしょうか。 そのため、コンバータは、かなりのビット長 (255 → 8 ビット、256 → 9 ビット) と、切り上げられたバイト長を報告します。 バイナリ出力は、すべてのニブルにパディングされ、4 つにグループ化されるため、4 つのビットの各グループは、エンコードする 16 進数の直下に位置します。
許容入力、正確なエラー
現実世界の値は、装飾とともに到着します。 0xDEADBEEF スタックトレースから、 0b1010_1111 さび文字から、 0o755 CHMOD から、 FF FF FF 16 進エディターからコピーしました。 すべて受け入れられます。選択したベースに同意すると、プレフィックスが削除され、アンダースコアとスペースは数字区切り記号として扱われます。
選択したベースに桁が不正な場合、エラーでその名前が指定されます。 タイプ 1092 8 進線で、あなたは得る "9" is not valid in base 8. Base 8 uses 0-7.- 一般的な " 無効な入力とquot; ではありません。どの文字を見に行くかについては何もわかりません。
負の数のサポート
負の値は、先頭のマイナス記号で変換してレンダリングします。 これは、符号と大きさの表記であり、以下の 2 つの補数のセクションで説明する理由から、正直な答えです。
完全にブラウザで動作します
ネットワークの往復も、アップロードも、ログ記録もありません。 数マイクロ秒離れたところで算術が行われているため、キーストロークごとに結果が更新され、読み込まれた後はページはまったく接続せずに動作し続けます。
ナンバーベースコンバータの使い方
ステップ 1: 番号を入力してください
Fromフィールドに値を入力または貼り付けます 最初に装飾を剥がす必要はありません - 0xFF、 0b1010、 0o755、 1010_1111、そして DE AD BE EF すべて受け入れられます。 主要 + あんど - サインが機能します。 先行ゼロは無害です。
ステップ 2: ソース ベースを選択する
入力した内容を読み方をコンバーターに伝えます。 これは、人々がスキップするステップであり、重要なのは次のとおりです。 101 2 進数で 5 個、8 進数で 65 個、101 個、10 進数で 257 個です。 4 つの異なる数字、1 つの文字列。 ショートカット ボタンは、バイナリ、8 進、10 進、16 進数、および 16 進数でカバーします。ドロップダウンは 2 ~ 36 のすべてをカバーします。
入力した文字をソース ベースが読み取れない場合、サイレント 間違った答えではなく、その文字に名前を付けるメッセージが表示されます。
ステップ 3: ターゲット ベースを選択する
取り出したい基底を選びます 結果はすぐに表示され、入力すると更新されます - 待ち時間となるサーバーがないため、変換ボタンはありません。スワップボタンは方向を反転し、結果を入力に移動します。これは、値を往復して生存を確認する最も早い方法です。
ステップ 4: パネルを読む
変換の下で取得します。
- すべての拠点を一度に- 2 進数、8 進数、10 進数、16 進数の同じ値に、カスタム ベースを選択した場合を加えます。
- ビット長、バイト長、16 進数- サイズ番号.
- グループ化されたバイナリ- ビットはパッドを入れられ、16 進数の数字に合わせてニブルに分割されます。
ステップ 5: コピー
裸の結果をコピーするか、完全な式 (255 (base 10) = FF (base 16)) コミット メッセージ、コード コメント、またはバグ レポートで変換を自己文書化する場合。 2 番目のオプションは、数字と一緒にベースを運ぶため、他の人に番号を説明するときに使用するオプションです。
位置表記が実際にどのように機能するか
私たちが使用するすべてのベースは、 位置の システム、つまり、数字の貢献度は、その位置によって異なります。 ベース B では、位置 i (右側のゼロからカウント) の数字は価値があります。 digit × b^i。 その単一のルールがすべてのベースを生成します。
1234 を 10 進数で取る:
1×10³ + 2×10² + 3×10¹ + 4×10⁰ = 1000 + 200 + 30 + 4 = 1234
今取る 1A3 16 進数で、A は 10 です。
1×16² + 10×16¹ + 3×16⁰ = 256 + 160 + 3 = 419
同じルール、異なるベース。 あんど 10101111 バイナリで:
1×2⁷ + 0 + 1×2⁵ + 0 + 1×2³ + 1×2² + 1×2¹ + 1×2⁰ = 128 + 32 + 8 + 4 + 2 + 1 = 175
このルールに該当する 2 つのアルゴリズムは、コンバーター全体です。
ベース B で数字を読み取る 左から右の折り目です。 ゼロから始めて、各桁について: value = value × b + digit。 これは Horner の方法であり、コンバーターが計算する必要がないのはそのためです。 b^i 明示的に - べき乗、浮動小数点、累積誤差はありません。
ベース C で値を書き込む 分割が繰り返されます。 C で割り、残りを次の桁 (右から) に保ち、商をゼロにするまで繰り返します。 残りは逆に読み取られ、数字です。
どちらの演算も整数で正確に行われるため、bigint で実行すると、パイプラインのどこにも丸めずに変換が可能になります。 値 123456789012345678901234567890 は、16 進数に変換されます。 18EE90FF6C373E0EE4E3F0AD2ー 97 ビット、13 バイト - そして、あなたが始めた小数点以下を正確に元に戻します。 に構築されたコンバータでそれを試してください parseInt。
数字のアルファベットについては、1 つだけ注目に値します。 ベース 36 は、大文字と小文字を区別しない ASCII 英数字で書くことができる最後のベースであるため、実用的な上限です。 0-9 10桁を与えて、 A-Z さらに26 個与えます そして10 + 26 = 36. push past it and you need case sensitivity (base 62) or a symbol alphabet (Base64), at which point you are no longer doing arithmetic notation - you are doing binary-to-text encoding, which is a different job with different rules.もしそれを押しのけると、大文字と小文字の区別 (base62) または記号アルファベット (Base64) が必要になるなら、 を使う Base64 コンバーター 代わりに。
なぜ 16 進数がバイナリにすっきりとマップされるのか
ヘックスはコンパクトであるため、プログラミングでは人気がありません。 ベース 10 は、人間の親しみやすさの点で同じ値で、ベース 16 よりもコンパクトであり、コンパクトさが目標である場合、ベース 36 を使用します。 16 進数が勝った理由は次のとおりです。 16 は 2⁴です。
つまり、1 つの16 進数が正確に4 つの2 進数をエンコードします - 1 つのニブル - それらの間の境界を横切るキャリーは決してありません マッピングはルックアップテーブルであり、算術演算ではありません:
| バイナリ | ヘックス | バイナリ | ヘックス |
|---|---|---|---|
| 0000 | 0です | 1000 | 8です |
| 0001 | 1です | 1001 | 9です |
| 0010 | 2です | 1010 | あ |
| 0011 | 3つです | 1011 | っb |
| 0100 | 4です | 1100 | c |
| 0101 | 5です | 1101 | d |
| 0110 | 6か | 1110 | e |
| 0111 | 7です | 1111 | f |
変換する 11111111 に分割することで 1111 1111、テーブルから各ニブルを読み取って、連結します。 FF。 算術はありません。 変換する 0xDEADBEEF 各桁を展開してバイナリにします。 1101 1110 1010 1101 1011 1110 1110 1111。 構造は生き残る。
バイトは 8 ビット、16 進数は 4 です。 1 バイトは常に正確に 2 進数の 16 進数です。 0x00 スルー 0xFF 可能なすべてのバイトをカバーします。そのため、16 進ダンプ、MAC アドレス、カラー コード、およびメモリ アドレスはすべて 16 進で記述されます。 0xFF 1 つのフルバイトを見ていることを一目で教えてくれます。 decimal 255 はあなたにそのようなことは何も教えてくれません - 255 が 28 - 1 であることを知っておく必要があり、65535 と 4294967295 についても同じリコールを実行する必要があります。
8 進数は 8 = 23 の場合、同じ原理で動作するため、1 進数の桁は正確に 3 ビットです。 まさにそのため、UNIX ファイルのアクセス許可が 8 進数です。モードは 3 つのビット (読み取り、書き込み、ユーザーの場合は実行)、3 ビットは 1 進数の 1 桁のグループです。 chmod 755 です 111 101 101ー そして今、桁はあなたが覚えた魔法の数字ではなく、何かを意味している 私の権限のバグが起こった理由でもあります: 755 小数ではそうではありません 755 8 進数で、文字列については何もありません 755 どちらかを発表します。 ザ・ ナンバーベースコンバータ 3 秒で解決できるように、一部存在します。
2 つの補数と、このツールがマイナス記号を使用する理由
入り -42 そしてコンバーターが返す -101010。 一部の人々は期待しています 11010110 そして、マイナス記号がバグを考慮してください。 そうではありません。バイナリについて最も誤解されている唯一の理由であるため、理解する価値があります。
2 の補数は、数の性質ではありません。 これは固定幅レジスタのプロパティです。
値 -1 には、正準のバイナリ表現はありません。 8 ビットの 2 の補数レジスタでは、 11111111 (0xFF. 16ビットで 0xFFFF。 32 ビットで、 0xFFFFFFFF。 64 ビットで、16 の FS。 これらは同じビット パターンを書き込む 4 つの異なる方法ではありません。4 つの方法です。 異なるビット パターン、どちらが正しいかは、タイプ宣言に含まれる幅に完全に依存し、数値ではありません。
任意の精度の整数 - これは BigInt とは何か、そしてこのコンバーターは機能します - には幅がありません。したがって、追加のコンテキストなしで意味のある唯一の表現は符号の大きさです。マイナス記号の後に等級's の数字が続きます。それが得られるものであり、自信を持って間違った答えではなく、正直な答えです。
あなたが する 2 の補数パターンが必要です。レシピは簡単で、このツールで実行できます。
- 幅を決めて、
nビット。 - 計算する
2^n + value(とvalue否定的)。 8 ビットでの -42 の場合: 256 − 42 = 214。 - 214 をターゲットのベースに変換します。
11010110バイナリで、D616進数で。
学習したかもしれない機械的ショートカット - すべてのビットを反転してから1 つ追加する - は同じ結果を生じます なぜならxのnビット全てを反転すると (2^n − 1) − x、追加すると与えられます 2^n − x。 算術アイデンティティは同じ操作です。ビット反転バージョンは、仕切りなしで行う方法です。
人々が実際に使用する幅のクイック リファレンス:
| 幅 | 範囲 (署名) | 16進数の−1 | 最も負の値 |
|---|---|---|---|
| 8ビット | −128~127 | FF |
80 (-128) |
| 16ビット | −32,768 から 32,767 | FFFF |
8000 |
| 32 ビット | −2,147,483,648 から 2,147,483,647 | FFFFFFFF |
80000000 |
| 64ビット | ±9.22 × 10¹⁸ | FFFFFFFFFFFFFFFF |
8000000000000000 |
すべての行の非対称性に注意してください。正の値がゼロであるため、正よりも負の値が 1 つ多い。 これが、最も負の整数を否定すると、それ自体が返される従来のオーバーフローのバグの原因です。 値または文字列のビットを直接表示したい場合は、 バイナリ トランスレータ そのためのコンパニオン ツールです。
36 のベースは何ですか?
ベース 36 は好奇心のように見え、実際には「エキゾチック」ベースの中で最も実用的です。その理由の 1 つは、人間がケースフォールドし、人間がエスケープせずに URL にドロップすることで生き残る最も密度の高い数字表記です。
同じ 64 ビット値を基準全体で比較します。
| ベース | 64 ビット値に必要な桁数 | 例 |
|---|---|---|
| バイナリ (2) | 64 | 1111... |
| 10 進数 (10) | 20 | 18446744073709551615 |
| 16 進数 (16) | 16か | FFFFFFFFFFFFFFFF |
| 36 ベース | 13です | 3W5E11264SGSF |
| 62 ベース | 11 | 大文字小文字を区別 |
基本 36 では、16 進数よりも 35% 節約でき、10 進数で 35% 節約できます。URL パスで安全で、ファイル名で安全で、電話では明白で、ユーザーが大文字で入力するかどうかに関係なく、同じ文字のみを使用します。 短いリンク ID、請求書番号、クーポン コード、注文参照、およびコンパクトなタイムスタンプで表示されるのはそのためです。 Date.now().toString(36) は、並べ替え可能な、人間型の短い ID を生成するための一般的なトリックです。
トレードオフは判読性です。 3W5E11264SGSF 36 は 2 の累乗ではないため、Hex のように構造を考えることができるものではありません。また、クリーンなビットの位置合わせもありません。 番号が不透明な識別子で、目標がコンパクトである場合は、基本 36 を使用してください。 数値のビット構造がポイントの場合は、16 進数を使用します。
よくある使用例
メモリと 16 進ダンプのデバッグ。 あなたのデバッガーが表示されます 0x7FFE4A3C、あなたのログが表示されます 2147330620、そして、それらが同じアドレスかどうかを知る必要があります。 1 つを貼り付け、もう一方を読みます。
ファイルのアクセス許可。 変換する 755 8 進数からバイナリまで、そして 111 101 101、これは、モード フィールドが定義する順序の 9 つの権限ビットです。 これは、その理由を誰かに説明する最も簡単な方法です chmod 644 あんど chmod 664 グループ書き込みビットが 1 つずつ異なります。
色の値。 #FF5733 は3 バイト: 赤255、緑87、青51.16 進数の色をその10 進数の成分に分割すると、2 進数の桁の時間変換になります。 - パレット、コントラスト、フォーマット変換 - 完全なワークフローの場合 カラーピッカー エンドツーエンドで処理しますが、基礎となる算術はまさにこれです。
ビットマスクとフラグ。 のフラグフィールド 0b00101100 です 0x2C そして小数44。 どのフラグが設定されているかを確認するとき、バイナリが唯一の読み込み可能な形式であり、定数をコードに書き込むときは、16 進数です。 常に両方が必要です。
ネットワークとプロトコルの仕事。 サブネット マスク、MAC アドレス、IPv6 グループ、プロトコル番号、およびチェックサムは、すべて 16 進数またはバイナリであり、ツールの半分では 10 進数または 10 進数です。 特に IP アドレスのオクテットは、マスクに触れた瞬間に点線とバイナリで小数点以下になります。
ハッシュと識別子。 あ SHA-256 出力は64の16 文字 - 256 ビット 32 バイトです それを10 進数に変換すると 78 桁の数字が生成されます そしてまさにそこがすべての素朴な変換器が壊れるところです なぜならそれは安全な整数上限よりも およそ10^25 倍大きいからです それらのハッシュを変換するのではなく生成しているなら ハッシュジェネレーター クライアント側を生成します。
面接とコースワークの問題。 基本変換は CS の基本の定番であり、ビット数を使用して 4 つの一般的な基本すべての値を一度に表示する参照実装を使用すると、自分の作業を高速にチェックできます。
基本比較
| ベース | 名前 | 数字 | 桁あたりのビット数 | どこで見ますか |
|---|---|---|---|---|
| 2です | バイナリ | 0-1 | 1です | ビットマスク、フラグ、ハードウェアレジスタ |
| 8です | 80 の | 0-7 | 3つです | UNIX ファイルのアクセス許可、レガシー C リテラル |
| 10か | 小数 | 0-9 | ~3.32 | 人間が書いたものはすべて |
| 16か | 16 進数 | 0-9、A-F | 4です | メモリ アドレス、色、ハッシュ、バイト数 |
| 32 | 32 ベース | 0-9、A-V | 5です | コンパクトな大文字小文字の区別がないエンコーディング |
| 36 | 36 ベース | 0-9、A-Z | ~5.17 | 短い ID、請求書コード、URL セーフ番号 |
"bits per digit" 列はテーブル全体を説明します。 2 のべき乗 (2、8、16、32) の基数は 1 桁あたりの整数ビット数を持ち、これは境界を越えるキャリーのないビット グループに数字がマッピングされることを意味します。つまり、16 進数から 2 進数への変換は計算ではなくルックアップになります。 2 のべき乗 (10、36) ではない基数は 1 桁あたりの小数ビット数を持つため、10 進数を 2 進数に変換するには純粋に算術が必要であり、置換では実行できません。
同じ入力文字列は、まったく異なる値を持ついくつかのベースで合法的な数値になることができます。 101 心に留めておくのに良いものです:
| と読みます | 値 |
|---|---|
| バイナリ | 5です |
| 80 の | 65 |
| 小数 | 101 |
| 16 進数 | 257 |
| 36 ベース | 1,297 |
5 つの数字、1 つの文字列。 base は表示設定ではありません。これはデータの一部であり、この記事のすべてのバグは、書き留めるのを忘れた場所から送信されます。
どのブラウザベースのユーティリティが手の届くところにあるかをより広範に調べるために、私が毎日使用しているものを収集しました。 Web 開発者のツールキット。
フェイク
10 進数をバイナリに変換するにはどうすればよいですか?
数字を 2 で繰り返し割り、残りを最後から最初まで読みます。 42 の場合: 42÷2 = 21 の残り 0、21÷2 = 10 の残り 1、10÷2 = 5 の残りの部分、5÷2 = 2 の残り 1、2÷2 = 1 の残り 0、1÷2 = 0 の残り 1。 残りのボトムアップを読むと、101010 になります。 コンバータは BigInt 算術でこれを実行するため、ポケット カリキュレーターが保持できるものをはるかに超えた値に対して正確に保ちます。
16 進数に 16 進数を変換するにはどうすればよいですか?
16 進数の各桁に 16 個の値を上げて、右側のゼロからカウントして、その位置の乗算にして、製品を追加します。 ff は (15 × 16) + 15 = 255 です。 1A3 は (1 × 256) + (10 × 16) + 3 = 419 です。 ソース ベースを 16 に設定し、値を 0x プレフィックスの有無にかかわらず貼り付け、すぐに小数点が表示されます。
バイナリを 16 進数に変換するにはどうすればよいですか?
2 進数を右から 4 のニブルにグループ化し、各ニブルを 1 つの 16 進数にマップします。 11111111 は、F と F の 1111 と 1111 に分割されるため、答えは FF です。 16 桁の 16 桁が 2 乗で正確に 4 ビットをエンコードし、グループ境界を越えることはありません。 16 進数がバイトに使用されるのはそのためです。1 バイトは常に正確に 2 進数の 2 桁です。
プログラマーが 16 進数ではなく 16 進数を使用するのはなぜですか?
16 進数はバイナリと 10 進数にきれいにマッピングされないためです。 16 進数は 1 進数で、1 バイトは正確に 2 進数です。したがって、0xFF は目に見えて完全なバイトであり、0xDeadBeef は目に見えて 4 バイトです。 10 進数は、そのような構造を与えません。255 については、それがバイトを埋めることを発表しません。 16 進数は、生のバイナリの 4 分の 1 の長さであると同時に、ビット レイアウトを読みやすくします。
このコンバーターは非常に大きな数を処理できますか?
はい。 すべての値は、数字ごとに数字で解析され、2^53 の天井も、どのサイズでも浮動小数点の丸めもありません。 256 ビットのハッシュ、完全な RSA モジュラス、または 500 桁の小数点を正確に変換します。 パーセイントまたは数で構築されたコンバータは、9,007,199,254,740,991 を超える値をサイレントに破損しています。これは、まさにエラーの最も見つけにくい範囲です。
負の数と 2 つの補数をサポートしていますか?
負の値は、符号-大きさ表記である先頭マイナス記号でサポートされ、レンダリングされます。 two' s 補数は、数値ではなく固定幅レジスタの特性であるため、意図的に適用されません。 -1 は 8 ビットの FF、16 ビットの FFFF、および 32 ビットの FFFFFFF です。 two' s 補数パターンを生成するには、選択した幅の 2 乗を負の値に追加し、結果を変換します - 8 ビットの -42 の場合、256 - 42 = 214、つまり 16 進数の D6 です。
ベース 36 は何に使用されますか?
ベース 36 は数字 0 ~ 9 の後に文字 A ~ Z を使用するため、大文字と小文字を区別しない ASCII 英数字から作成できる最も密度の高い数字表記を使用します。 短いリンク ID、請求書コード、クーポン コード、およびコンパクトなタイムスタンプに表示される、短い URL セーフな大文字と小文字の区別がつかない文字列を生成します。 64 ビット値は、10 進数の 20 桁または 16 進数の 16 桁ではなく、13 の基本 36 文字を使用します。
ビット長とバイト長はどういう意味ですか?
ビット長は、値の大きさの有効ビット数であり、先行ゼロを無視します。255 のビット長は 8 で、256 のビット長は 9 です。 バイト長は、8 の次の倍数まで丸められた数字です。 一緒に、値が当てはまる最小の整数型を示します。これが、最初に数値をバイナリに変換する実際の理由です。
数値を変換すると、自分のデータがサーバーに送信されますか?
いやー 。 すべての変換は、ブラウザーで JavaScript で計算されるため、ネットワーク ラウンド トリップの後ではなく、キーストロークごとに結果が更新されます。 入力したものは何も送信されず、ログに記録されます。また、ページが読み込まれると、コンバータはネットワーク接続なしで動作し続けます。



