計算ツール

基数変換ツール【無料・登録不要】2進数・8進数・10進数・16進数を相互変換|2の補数対応

基数変換ツール【無料・登録不要】2進数・8進数・10進数・16進数を相互変換|2の補数対応
engblog-poster

2 進数・8 進数・10 進数・16 進数を相互に変換できる無料ツールです。どれか 1 つの欄に入力すると、ほかの欄がすべて同時に変わります。桁数の多い大きな数も誤差なく計算でき、マイナスの数は 8・16・32・64 ビットの「2 の補数」で表示できます。

プログラミングでのビット演算の確認や、基本情報技術者試験・応用情報技術者試験の基数変換の学習に使えます。入力したデータはお使いのブラウザの中だけで処理され、サーバーには一切送信されません。

どれか 1 つの欄に入力すると、ほかの欄がすべて変わります。0b・0o・0x の付いた値や、空白・カンマ・アンダースコアの入った値もそのまま貼り付けられます。

整数だけに対応しています(小数は変換できません)。入力したデータはブラウザ内だけで処理し、サーバーへの送信や保存は一切行いません。

使い方

数を変換する

  1. 変換したい数を、その数の種類の欄に入力します(例:16 進数の「FF」なら「16 進数」の欄)。
  2. 入力と同時に、ほかの欄に変換結果が表示されます。
  3. 使いたい欄の「コピー」を押すと、その値をコピーできます。

「0b1010」「0o17」「0xFF」のようにプログラムで使う接頭辞が付いた値や、「1111 0000」「1,000,000」「0xFFFF_FFFF」のように空白・カンマ・アンダースコアで区切った値も、そのまま貼り付けて変換できます。16 進数の A〜F は大文字・小文字のどちらでも入力できます(結果は大文字で表示します)。

区切りの表示を切り替える

「区切りを入れて表示」にチェックが入っていると、2・8・16 進数は 4 桁ごとに空白を、10 進数は 3 桁ごとにカンマを入れて表示します。区切りのない値をコピーしたいときは、チェックを外してください。

マイナスの数を 2 の補数で表示する

  1. 「ビット数(2 の補数)」で、8 ビット・16 ビット・32 ビット・64 ビットのどれかを選びます。
  2. 「10 進数」の欄に、マイナスの数を入力します(例:-45)。
  3. 2・8・16 進数の欄に、選んだビット数の 2 の補数が表示されます(例:8 ビットなら 2 進数「1101 0011」、16 進数「D3」)。

反対に、ビット数を選んだ状態で 2 進数や 16 進数の欄に入力すると、それを 2 の補数として読んだ値を 10 進数の欄に表示します。たとえば 8 ビットで 16 進数の「FF」を入力すると、10 進数は「-1」になります。ツールの下には「符号付きの値」と「符号なし整数として読んだ値(この例では 255)」を並べて表示します。

選んだビット数で表せない値を入力したときは、エラーを表示します。たとえば 8 ビットでは、10 進数は -128〜127、2 進数は 8 桁まで、16 進数は 2 桁までです。「指定なし」を選ぶと、マイナスの数は「-1010」のように「-」を付けて表示し、ビット数の制限なく変換します。

基数とは?

基数(きすう)とは、数を表すときに「いくつで次の桁に繰り上がるか」を表す数のことです。ふだん使っている 10 進数は、0〜9 の 10 種類の数字を使い、10 になると桁が 1 つ上がります。この「10」が基数です。同じように、2 進数は 2、8 進数は 8、16 進数は 16 で桁が上がります。基数を変えて同じ数を表し直すことを「基数変換」といいます。

種類使う数字10 進数の 255 を表すと主な使い道
2 進数0、11111 1111コンピューター内部のデータ、ビット演算
8 進数0〜7377Linux のファイルのパーミッション(chmod 755 など)
10 進数0〜9255ふだんの計算
16 進数0〜9、A〜FFFメモリのアドレス、文字コード、色の指定(#FF0000 など)

コンピューターは、電気が流れているか・いないかの 2 つの状態でデータを表すため、内部では 2 進数を使います。ただし、2 進数は桁数が多く読みにくいので、人が読むときには 16 進数がよく使われます。16 進数の 1 桁は、2 進数のちょうど 4 桁(4 ビット)にあたり、1 バイト(8 ビット)を 16 進数の 2 桁で表せるためです。同じように、8 進数の 1 桁は 2 進数の 3 桁にあたります。

プログラミング言語では、数の前に接頭辞を付けて基数を表すことがよくあります。たとえば JavaScript や Python では、「0b1010」が 2 進数、「0o17」が 8 進数、「0xFF」が 16 進数です。

手計算での変換方法

10 進数 → 2 進数:2 で割った余りを下から並べる

10 進数を 2 で割り続け、商が 0 になるまで余りを書き出します。最後に、余りを下から順に並べると 2 進数になります。10 進数の 13 の場合は次のとおりです。

  • 13 ÷ 2 = 6 余り 1
  • 6 ÷ 2 = 3 余り 0
  • 3 ÷ 2 = 1 余り 1
  • 1 ÷ 2 = 0 余り 1

余りを下から並べると「1101」になり、10 進数の 13 は 2 進数で 1101 です。8 進数・16 進数に変換するときは、2 の代わりに 8 や 16 で割ります。

2 進数 → 10 進数:各桁の重みを足す

2 進数の各桁には、右から 1、2、4、8、16……(2 の 0 乗、1 乗、2 乗……)という「重み」があります。1 になっている桁の重みを足すと 10 進数になります。2 進数の 1101 なら、8 + 4 + 0 + 1 = 13 です。

16 進数や 8 進数も同じ考え方で、重みが 16 進数なら 1、16、256……、8 進数なら 1、8、64……になります。たとえば 16 進数の B6 は、B が 10 進数の 11 なので、11 × 16 + 6 × 1 = 182 です。

2 進数 ⇔ 16 進数・8 進数:桁をまとめて置き換える

2 進数を右から 4 桁ずつ区切り、それぞれを 16 進数の 1 桁に置き換えると、16 進数になります。8 進数の場合は、右から 3 桁ずつ区切ります。10 進数を経由しなくてよいので、すばやく変換できます。

  • 16 進数:1011 0110 → 1011(11 = B)と 0110(6)→ B6
  • 8 進数:10 110 110 → 10(2)と 110(6)と 110(6)→ 266

16 進数から 2 進数に戻すときは、反対に 16 進数の 1 桁を 2 進数の 4 桁に置き換えます。0〜F と 2 進数 4 桁の対応は次のとおりです。

16 進数2 進数10 進数16 進数2 進数10 進数
000000810008
100011910019
200102A101010
300113B101111
401004C110012
501015D110113
601106E111014
701117F111115

コマンドで変換する

Linux や Git Bash などの bash では、「16#」のように基数と「#」を付けると、その基数の数として計算できます。次のコマンドを実行すると「255」と表示されます。

echo $((16#ff))

10 進数を 16 進数にするには printf の %x を使います。次のコマンドを実行すると「ff」と表示されます(%o にすると 8 進数の「377」になります)。

printf '%x\n' 255

Windows の PowerShell では、[Convert]::ToString の 2 つ目に基数(2・8・16)を指定します。次のコマンドを実行すると「11111111」と表示されます。

[Convert]::ToString(255, 2)

Python の対話モードでは、bin()・oct()・hex() で 2・8・16 進数に、int() の 2 つ目に基数を指定して 10 進数に変換できます。次の入力では「255」と表示されます。

int('11111111', 2)

2の補数

コンピューターは、マイナスの数を「-」の記号ではなく、ビットの並びで表します。そのときに最もよく使われる方法が「2 の補数」です。2 の補数では、いちばん左のビットが 1 ならマイナス、0 ならプラス(または 0)になります。

2 の補数の求め方:ビットを反転して 1 を足す

マイナスの数を 2 の補数で表すには、まずプラスの値を 2 進数で書き、すべてのビットを反転(0 と 1 を入れ替え)してから 1 を足します。8 ビットで -45 を表す場合は次のとおりです。

  1. 45 を 8 ビットの 2 進数で書く:0010 1101
  2. すべてのビットを反転する:1101 0010
  3. 1 を足す:1101 0011(16 進数で D3)

反対に、2 の補数のビット列から元の値を求めるときも、「反転して 1 を足す」と絶対値(符号を除いた値)が求められます。1101 0011 を反転すると 0010 1100、1 を足すと 0010 1101(45)なので、元の値は -45 です。また、符号なし整数として読んだ値(1101 0011 なら 211)から 2 の 8 乗の 256 を引いても、211 − 256 = -45 と求められます。

ビット数ごとの表せる範囲

n ビットの 2 の補数で表せる範囲は、-2 の (n−1) 乗 〜 2 の (n−1) 乗 − 1 です。マイナス側のほうが 1 つ多いのが特徴です。

ビット数最小値最大値
8 ビット-128127
16 ビット-32,76832,767
32 ビット-2,147,483,6482,147,483,647
64 ビット-9,223,372,036,854,775,8089,223,372,036,854,775,807

表せる範囲を超えると、値があふれて(オーバーフローして)まったく違う値になります。たとえば 8 ビットで 127(0111 1111)に 1 を足すと 1000 0000 になり、2 の補数としては -128 と読まれます。32 ビットの最大値 2,147,483,647 は、Unix 時間の「2038 年問題」の原因になる値でもあります。

2 の補数が使われるのは、足し算の回路だけで引き算もできるからです。たとえば 8 ビットで 50 +(-45)を計算すると、0011 0010 + 1101 0011 = 1 0000 0101 となり、9 ビット目にあふれた 1 を捨てると 0000 0101(5)になって、正しく 50 − 45 = 5 が求められます。

基本情報・応用情報の試験での出題例

IPA(情報処理推進機構)が公開している試験のシラバス(出題範囲を詳しく示した資料)では、基本情報技術者試験(Ver.9.2)・応用情報技術者試験(Ver.7.2)とも、「基礎理論」の「離散数学」に「基数」(2 進数・8 進数・10 進数・16 進数・n 進数の表現、基数の変換手法)と「数値の表現」(負の数の表現〔補数表現〕など)が含まれています。また「算術演算と精度」には、表現可能な数値の範囲やオーバーフロー(あふれ)も挙げられています。

ここでは、これらの内容を確認できる自作の例題を紹介します(実際の過去問ではありません)。このツールで答えを確かめながら、手計算でも解いてみてください。

例題 1:2 進数を 16 進数と 10 進数に変換する

問題:2 進数の 1011 0110 を、16 進数と 10 進数で表しなさい。

答え:16 進数は B6、10 進数は 182。4 桁ずつ区切って 1011 = B、0110 = 6 とし、10 進数は 11 × 16 + 6 = 182 と計算します。

例題 2:マイナスの数を 2 の補数で表す

問題:10 進数の -45 を、8 ビットの 2 の補数で表しなさい。

答え:1101 0011。45(0010 1101)のビットを反転して 1101 0010 とし、1 を足します。

例題 3:2 の補数のビット列を 10 進数に直す

問題:8 ビットの 2 の補数で表された 1111 1110 は、10 進数でいくつか。

答え:-2。いちばん左のビットが 1 なのでマイナスです。反転すると 0000 0001、1 を足すと 0000 0010(2)なので -2 です(符号なしで読んだ 254 から 256 を引いても求められます)。

例題 4:表せる範囲を答える

問題:16 ビットの 2 の補数で表せる整数の範囲を答えなさい。

答え:-32,768 〜 32,767。-2 の 15 乗 〜 2 の 15 乗 − 1 です。

よくある質問

入力したデータは保存されませんか?

保存されません。変換はすべてお使いのブラウザの中で行われ、サーバーへの送信も保存も行いません。ページを閉じると入力内容は消えます。

何桁まで変換できますか?

1 つの欄に 2,000 文字まで入力できます。JavaScript の BigInt(桁数に上限のない整数)で計算しているので、64 ビットを超える大きな数でも、誤差なく変換できます。ふつうの JavaScript の数値(Number)は 2 の 53 乗を超えると誤差が出ますが、このツールではその心配はありません。

小数は変換できますか?

このツールは整数だけに対応しています。小数点を含む値を入力すると、エラーを表示します。

「範囲を超えています」と表示されるのはなぜですか?

「ビット数(2 の補数)」で選んだビット数では表せない値を入力したためです。たとえば 8 ビットを選んだまま 10 進数に 200 を入力すると、8 ビットの 2 の補数の範囲(-128〜127)を超えるためエラーになります。ビット数を大きくするか、「指定なし」を選んでください。なお、8 ビットのビット列を「符号なし整数」(0〜255)として見たいときは、2 進数か 16 進数の欄に入力すると、ツールの下に符号なしの値も表示されます。

関連する記事・ツール

ABOUT ME
hr
hr
エンジニアとして働いている hr です。仕事や資格勉強で「こんなツールがあれば」と感じたものを、無料Webツールと解説記事にして発信しています。
記事URLをコピーしました