基数変換ツール
2 進数、8 進数、10 進数、16 進数を相互に変換します。
このツールについて
2 進数、8 進数、10 進数、16 進数のいずれかで数値を入力すると、他のすべての基数での値と、バイトごとにまとめたビットが表示されます。任意の大きさの整数を扱え、0x、0b、0o のプレフィックスも認識します。
使い方
- 2 進数、8 進数、10 進数、16 進数の 4 つのフィールドのいずれかに数値を入力します。
- 他のフィールドは即座に更新されます。0x、0b、0o などのプレフィックスも使えます。
- ビットパネルで、値をバイトごとに分けて確認できます。
よくある質問
- どのくらい大きな数まで扱えますか?
- サイズの制限はありません。JavaScript の BigInt を使っているため、32 ビットや 64 ビットの上限も丸め誤差もありません。
- 16 進数が 0x で始まるのはなぜですか?
- 数字が 16 進数であることを示す C 言語由来の慣習で、現在ではほとんどの言語で使われています。同様に、0b は 2 進数、0o は 8 進数を示します。
- 8 進数は今でもどこで使われていますか?
- 主に Unix のファイルパーミッション用です。755 は rwxr-xr-x を意味します。8 進数の各桁が 3 つの権限ビットにきれいに対応しています。
- 16 進数を ASCII テキストに変換するには?
- このツールは文字列ではなく数値を変換します。16 進数のテキストでは 2 桁ごとに 1 バイトで、それを ASCII 表で調べます。48 65 6C 6C 6F は「Hello」になります。コマンドラインでは、echo 48656c6c6f | xxd -r -p で 16 進数の文字列をテキストに戻せます。
- 小数や小数点を含む数値を変換できますか?
- いいえ、整数のみです。そもそも 2 進数での小数は扱いが厄介です。10 進数の 0.1 は 2 進数では正確に表せず無限に繰り返すため、ほとんどのプログラミング言語では 0.1 + 0.2 がぴったり 0.3 になりません。浮動小数点数は、単純な 2 進数の整数ではなく、IEEE 754 形式で格納されます。
- 8、16、32、64 ビットに収まる最大の数は?
- 符号なしの場合は 2ⁿ − 1 で、255、65,535、4,294,967,295、18,446,744,073,709,551,615 です。符号付きの値はその約半分までで、32 ビットなら 2,147,483,647 です。JavaScript の数値が正確なのは 9,007,199,254,740,991 までなので、このツールはそれを超えても精度を保つために BigInt を使います。
2 進数と 10 進数を相互に変換する方法
2 進数の各桁は 2 のべき乗の重みを持ち、右端の 1 から始まります。1011 を 10 進数に変換するには、1 がある位置の値を足します: 8 + 0 + 2 + 1 = 11。16 進数も 16 のべき乗で同じように計算するので、0x2F は 2 × 16 + 15 = 47 です。8 進数は 8 のべき乗を使います。どの基数にも使える規則は 1 つで、各桁の数字に、基数をその桁の位置で累乗した値を掛けることです。
逆に変換するには、変換先の基数で繰り返し割り、余りを最後から順に書き出します。11 を 2 で割り続けると余りは 1、1、0、1 となり、逆から読むと 1011 になります。この基数変換ツールでは、どれか 1 つの欄に入力するだけで残りの 3 つが更新されます。コードでは、JavaScript なら parseInt(text, 2) と n.toString(16)、Python なら int(text, 2) と hex(n) を使います。
プログラマーが 16 進数を使うのはなぜですか?
16 進数の 1 桁はちょうど 4 ビットを表すため、2 桁で 1 バイトを表せます。そのため 16 進数は、バイナリデータをコンパクトで読みやすく書く方法になります。11111111 は FF になり、32 ビットの値はどれも 8 文字に収まります。メモリアドレス、#FF8800 のようなカラーコード、ハッシュ、MAC アドレス、U+1F680 のような Unicode のコードポイント、xxd や hexdump などのツールが出力するバイトダンプで目にします。
ここの「ビット」パネルを見れば、その関係が直接わかります。値はバイト単位になるようにパディングされ、8 ビットの各グループの下に 2 桁の 16 進数の値が表示されます。48879 は 10111110 11101111 になり、それぞれ BE と EF のラベルが付くため、0xBEEF と読めるわけです。フラグ、ビットマスク、バイト境界の確認が簡単になります。サブネット計算機は、同じ 2 進数表示を IPv4 アドレスとネットマスクに適用します。
2 進数で負の数を表す方法: 2 の補数
コンピューターは通常、符号付き整数を 2 の補数で格納します。−1 を 8 ビットで書くには、1 の全ビットを反転して 1 を足します。00000001 は 11111110 になり、1 を足すと 11111111、つまり 0xFF になります。最上位ビットが符号の役割を果たすため、8 ビットの符号付きの値の範囲は −128〜127 で、同じビットを符号なしとして読むと 0〜255 になります。ビットパターンは同じで、解釈が変わるだけです。
この変換ツールは、固定幅のレジスタではなく通常の整数を扱います。-5 と入力すると、2 の補数のパターンではなく、マイナス記号を先頭に付けたまま、2 進数で -101、16 進数で -5 と表示されます。負の数の 8 ビットのパターンを得るには、先に 256 を足します: −5 + 256 = 251 で、これは 0xFB です。32 ビットなら 4294967296 を足します。スペースとアンダースコアは無視されるため、1111_1011 のような入力も使えます。
10 進数・16 進数・2 進数・8 進数の対応表
よく調べる数値を、4 つの基数すべてで示します。
| 10 進数 | 16 進数 | 2 進数 | 8 進数 |
|---|---|---|---|
0 | 0x0 | 0000 | 0o0 |
1 | 0x1 | 0001 | 0o1 |
2 | 0x2 | 0010 | 0o2 |
3 | 0x3 | 0011 | 0o3 |
4 | 0x4 | 0100 | 0o4 |
5 | 0x5 | 0101 | 0o5 |
6 | 0x6 | 0110 | 0o6 |
7 | 0x7 | 0111 | 0o7 |
8 | 0x8 | 1000 | 0o10 |
9 | 0x9 | 1001 | 0o11 |
10 | 0xA | 1010 | 0o12 |
11 | 0xB | 1011 | 0o13 |
12 | 0xC | 1100 | 0o14 |
13 | 0xD | 1101 | 0o15 |
14 | 0xE | 1110 | 0o16 |
15 | 0xF | 1111 | 0o17 |
16 | 0x10 | 0001 0000 | 0o20 |
32 | 0x20 | 0010 0000 | 0o40 |
64 | 0x40 | 0100 0000 | 0o100 |
100 | 0x64 | 0110 0100 | 0o144 |
127 | 0x7F | 0111 1111 | 0o177 |
128 | 0x80 | 1000 0000 | 0o200 |
255 | 0xFF | 1111 1111 | 0o377 |
256 | 0x100 | 0001 0000 0000 | 0o400 |
512 | 0x200 | 0010 0000 0000 | 0o1000 |
1000 | 0x3E8 | 0011 1110 1000 | 0o1750 |
1024 | 0x400 | 0100 0000 0000 | 0o2000 |
4096 | 0x1000 | 0001 0000 0000 0000 | 0o10000 |
65535 | 0xFFFF | 1111 1111 1111 1111 | 0o177777 |
うまく動かない、または結果がおかしいですか? このツールの問題を報告