2進数変換

2進数と10進数・8進数・16進数を、その場で相互に変換する道具です。負の数は2の補数 (ビット幅を選択)、正の小数点つきの数も扱え、循環小数は()で厳密に示します。割り算の筆算、小数部の計算、2の補数の手順、位の重みといった計算の途中も見られます。値はブラウザの中だけで計算し、送信しません。

文 ゆめさく公開 更新

2進数
8進数
10進数
16進数
符号の扱い

符号なしでは負の数を扱えません (小数部は扱えます)。負の数を使うときはここを2の補数に切り替えてください (2の補数は整数だけです)。

表示
計算の途中を見る (10進数 と 2進数 の間)

10進数 26 を 2進数 に直す筆算です。2 で割り続け、商が 0 になるまでの余りを、下から上へ読むと答えになります。

割られる数÷ 2商余り (下から読む)
26÷ 2130
13÷ 261
6÷ 230
3÷ 211
1÷ 201

2進数 11010 を10進数に直す、位の重みの内訳です。各桁の値に、その桁の重み (2 の累乗) を掛けて、全部を足し合わせます。

桁重み (2^n)桁 × 重み
12^4 = 1616
12^3 = 88
02^2 = 40
12^1 = 22
02^0 = 10

合計 26

使い方

  1. 変換したい数を、10進数・2進数・8進数・16進数のどれか1つの欄に入力します。残り3つの欄が自動で計算されます。
  2. 負の数や特定のビット幅で考えたいときは「符号の扱い」を2の補数に切り替え、ビット幅を選びます。
  3. なぜその答えになるかを確かめたいときは「計算の途中を見る」を開き、割り算の筆算・小数部の計算・2の補数の手順・位の重みの内訳を読みます。
  4. 値の右の「コピー」でプログラムや資料にそのまま貼り付けられます。

この2進数変換のしくみ

この道具は、2進数を先頭に、10進数・8進数・16進数の4つの欄を常に並べ、最後に編集した欄から残り3つを計算し直します。整数部はBigIntで持つので、JavaScript の通常の数値 (Number) で安全に扱える桁数を超えても、正確な値のまま変換できます。

2進数から10進数へは、位の重みの合計

2進数の各桁は、右から1、2、4、8、16…と2の累乗の重みを持ちます。各桁の数字 (0か1) にその桁の重みを掛けて、全部を足すと10進数になります。たとえば2進数の11010は、1×16 + 1×8 + 0×4 + 1×2 + 0×1 = 26です。

2の累乗 (桁の重み) の表
2のべき乗値
2^416
2^532
2^664
2^7128
2^8256
2^9512
2^101,024
2^112,048
2^124,096

10進数から2進数へは、2で割り続けて余りを拾う

10進数を2進数にするときは、2で割った余り (0か1) を集め、商が0になるまで割り続けます。得られた余りを、最後に求めたものから順に (下から上へ) 並べると2進数になります。「計算の途中を見る」では、入力した値でこの割り算を実際に行った表をそのまま出します。

小数部は分数のまま計算し、循環を検出する

浮動小数点で小数部を近似する道具は、丸めた値を10進数に戻すと元の値と一致しないことがあります。この道具は、入力した小数部を「分子 ÷ 基数の桁数乗」という分数のまま持ち、2を掛けては整数部を取り出す操作を繰り返します。割り切れれば厳密な値になり、同じ余りに戻ってくれば、そこから先が無限に繰り返す循環小数だと分かるので、繰り返す部分を()で囲んで示します。この()の表記は、表示するだけでなく入力としても厳密な分数として読み直すので、循環小数が出ている欄を次に押して別の基数へ移しても、値が変わりません。

0〜31 の対応表

0〜31 の対応表
10進数2進数 (5桁)8進数16進数
00000000
10000111
20001022
30001133
40010044
50010155
60011066
70011177
801000108
901001119
100101012A
110101113B
120110014C
130110115D
140111016E
150111117F
16100002010
17100012111
18100102212
19100112313
20101002414
21101012515
22101102616
23101112717
24110003018
25110013119
2611010321A
2711011331B
2811100341C
2911101351D
3011110361E
3111111371F

2の補数とビット幅

2進数そのものには符号の文字がないため、負の数を含めるときは「最上位ビットを符号として使う」2の補数という表し方を使います。ビット幅をwとすると、負の数xの2の補数のビット列は、次の式で求められます。

ビット列 = 2^w + x (xが負のとき)

8ビットの2の補数の例
10進数2進数 (8ビット)16進数 (8ビット)
00000000000
10000000101
127011111117F
-111111111FF
-211111110FE
-1281000000080

MDN Web Docs のNumber.prototype.toString()のページは、radixに2を指定しても、負の数は2の補数ではなく符号付きの文字列 (先頭に-) になると明記しています。つまり、(-1).toString(2)は"-1"であって、8ビットの2の補数である"11111111"にはなりません。2の補数のビット列が欲しいときは、ビット幅を決めてPythonのint.to_bytes(signed=True)のように別の計算をする必要があり、この道具の「符号の扱い」の2の補数は、その計算をビット幅ごとに行っています。

2進数の足し算と引き算

この道具は変換に絞っていますが、2進数の足し算は10進数と同じ繰り上がりの考え方で手計算できます。

0101 (5) + 0011 (3) = 1000 (8)

右の桁から順に、1+1=10 (0を書いて1繰り上げ)、0+1+1=10 (0を書いて1繰り上げ)、1+0+1=10 (0を書いて1繰り上げ)、0+0+1=1で、1000になります。

00000101 (5) + 11111101 (3の2の補数) = 1 00000010 → 00000010 (2)

引き算は、引く数を2の補数にしてから足し算します。8ビットで5-⁠3を計算するなら、3 (00000011) を反転して (11111100)、1を足した11111101が3の2の補数です。これを5 (00000101) に足すと100000010 (9桁) になり、8ビットからあふれた最上位の桁を捨てると00000010、つまり2になります。

コードで書くなら

実際に動かして確かめたPythonとJavaScriptの例です。どちらも、この道具と同じ考え方 (BigIntや2の補数の式) を使っています。

binary_convert.py

# 10進数 -> 2進数、2進数 -> 10進数
n = 26
binary_text = bin(n)
int_value = int("11010", 2)
print(binary_text)  # '0b11010'
print(int_value)    # 26

# 2の補数 (8ビット) で -1 を2進数にする
width = 8
value = -1
bits = value & ((1 << width) - 1)
text = f"{bits:0{width}b}"
print(text)  # '11111111'

binary-convert.js

// 10進数 -> 2進数、2進数 -> 10進数
const n = 26;
const binaryText = n.toString(2);
const intValue = parseInt("11010", 2);
console.log(binaryText); // '11010'
console.log(intValue);   // 26

// BigInt なら 0b リテラルをそのまま読める
const big = BigInt("0b11010").toString(16);
console.log(big); // '1a'

// 2の補数 (8ビット) で -1 を2進数にする
const width = 8n;
const value = -1n;
const bits = value & ((1n << width) - 1n);
console.log(bits.toString(2).padStart(8, "0")); // '11111111'

よくある間違い

ゆめさくのCS理論編「2進数から10進数への変換」「10進数から2進数への変換」(cs-bin-to-dec、cs-dec-to-bin、2026-⁠10-⁠26 時点の確認テストから引用) が挙げる間違いです。

  • 2進数の桁の重みを1つずつずらして数える間違いです。10101を10進数にするとき、中央の1の重みを4ではなく2とすると19になり、正しい21になりません。
  • 2進数の余りを、出てきた順のまま並べてしまう間違いです。2で割り続けて得た余りは下の桁から出てくるので、最後に求めた余りから逆順に読む必要があります。
  • 重みを1ずつ数えるのではなく、1の個数だけを数えて桁の重みを無視してしまう間違いです。
  • 2の補数のビット列を、符号つきの10進数だと思って桁ごとに読み替えてしまう間違いです。最上位ビットが1なら、2^wを引く計算が別に必要です。
  • parseInt("102", 2)のように、2進数に使えない文字 (2以上の数字) を含めると、言語によっては途中までしか読まずに別の値になります。この道具は、使えない文字が1つでもあるとエラーで知らせ、黙って途中までの値を返すことはしません。

よくある質問

2進数変換とは、何をする道具ですか

10進数・2進数・8進数・16進数のどれかに数を入れると、残り3つの基数の値をその場で計算して並べる道具です。値はこのブラウザの中だけで計算し、どこにも送りません。負の数は2の補数 (ビット幅を選べます)、正の小数点つきの数も扱え、循環小数は()で厳密に示します。変換の途中 (割り算の筆算、小数部の計算、2の補数の手順、位の重み) も見られます。

2進数とは何ですか

0と1の2種類の数字だけで値を表す記数法です。コンピューターの中では、電気が流れている・いないの2つの状態で情報を扱うため、あらゆるデータが最終的には2進数 (ビットの並び) で保存されています。2進数の1桁をビット、8桁をバイトと呼びます。

2進数と10進数はどう変換しますか

2進数から10進数へは、各桁の数字にその桁の重み (2の累乗) を掛けて、すべての桁を足し合わせます。たとえば2進数の11010は、1×16 + 1×8 + 0×4 + 1×2 + 0×1 = 26です。10進数から2進数へは、2で割った余りを集め、商が0になるまで割り続け、得られた余りを最後のものから順に並べます。この頁の道具は、入力した値でこの2つの手順を実際に計算し、「計算の途中を見る」から割り算の筆算と位の重みの内訳をそのまま表示します。

2進数の小数点以下はどう変換しますか

小数部は浮動小数点を使わず、入力した桁を「分子 ÷ 基数の桁数乗」の分数として正確に扱い、2を掛けて整数部を取り出す操作を繰り返して求めます。割り切れれば厳密な値、割り切れずに同じ余りへ戻れば、そこから循環することを検出し、繰り返す部分を()で囲んで示します。たとえば10進数の0.1は2進数で0.0(0011) (0011が無限に繰り返す) になります。浮動小数点で32bitなどに丸める電卓は、丸めた値を10進数に戻すと元の値と一致しないことがありますが (たとえば-12.3は丸めた2進数から戻すと-12.2999999523162842になることがあります)、この道具は循環を()で正確に示すので、見た目の桁数で切り捨てたままにはしません。

マイナスの2進数はどう表しますか (2の補数)

2進数そのものには符号の文字がないので、負の数を含めるときは2の補数を使います。ビット幅 (8/16/32/64) を決め、負の値なら2のビット幅乗を足した値を2進数にします。たとえば8ビットで-1は、256-⁠1=255で、2進数の11111111です。最上位ビットが1かどうかで符号が決まるため、同じビット列でも「符号なしの255」なのか「符号つきの-1」なのかは、ビット幅と符号の扱いを決めて初めて定まります。

負の小数 (たとえば-12.3) は2進数にできますか

この道具では扱いません。2の補数は整数のための表し方で、小数部を含めるには「小数点の位置を固定した桁で持つ (固定小数点)」か「符号・指数部・仮数部に分けて持つ (浮動小数点、IEEE 754など)」かを、先に決める必要があります。どちらを選ぶかで同じ値でもビット列が変わるため、この道具は踏み込まず、正の小数か、整数の2の補数かに絞っています。負の小数を扱いたいときは、符号と絶対値を分けて (たとえば-12.3なら、符号は負、絶対値12.3をこの道具で変換) 考えてください。

2進数の足し算はできますか

この道具は基数の変換に絞っていて、足し算そのものは行いません。ただし10進数と同じ繰り上がりの考え方で手計算できます。たとえば0101 (5) + 0011 (3) は、右から順に1+1=10 (0を書いて1繰り上げ)、0+1+1=10 (0を書いて1繰り上げ)、1+0+1=10 (0を書いて1繰り上げ)、0+0+1=1で、1000 (8) になります。引き算は、引く数を2の補数にしてから足します。8ビットで5-⁠3を計算するなら、3の2の補数 (11111101) を5 (00000101) に足すと、100000010になり、8ビットからあふれた最上位の1桁を捨てると00000010 (2) です。

ビットとバイトの関係を教えてください

2進数1桁をビット (bit) と呼び、8ビットをまとめて1バイト (byte) と呼びます。1バイトで表せる範囲は符号なしで0から255 (2進数で00000000から11111111) までの256通りです。この道具で桁区切りを付けると、2進数は4桁ごと、16進数は2桁 (ちょうど1バイト) ごとに空白で区切るので、バイト単位の境目が見やすくなります。

文字列 (テキスト) を2進数にしたい時はどうしますか

文字は、まずUTF-⁠8などの符号化方式でバイト列に変換してから、各バイトを2進数8桁で表します。たとえば「あ」はUTF-⁠8でE3 81 82の3バイトになるので、2進数では11100011 10000001 10000010です。この頁の道具は整数の基数変換に絞っているので、文字列を直接貼り付ける機能はありません。

この道具の計算は、通信や保存をしますか

しません。入力した値も計算結果も、このページを開いているブラウザの中だけで計算します。ブラウザの開発者ツールでNetworkの画面を開き、値を打っても通信の行が増えないことで確かめられます。

何桁くらいの大きな数まで変換できますか

整数部は4096桁まで受け付けます。JavaScriptの通常の数値 (Number) は、安全に扱える範囲 (Number.MAX_SAFE_INTEGERあたり) を超えると誤差が出ますが、この道具はBigIntを使っているので、その範囲を超える整数も正確に計算します (この道具自体は4096桁までという上限を付けています)。

基本情報技術者試験の対策にも使えますか

ゆめさくの基本情報技術者試験対策コースは、基数変換を「毎回のように出題される計算問題」の1つとして扱っています。この頁の下にある関連レッスンへのリンクから、CS理論編の「2進数から10進数への変換」「10進数から2進数への変換」や、基本情報技術者(FE)対策の「基数と補数の計算」の回に進めます。

書き手と日付と出典

書き手
ゆめさく
公開日
更新日
  • MDN Web Docs Number.prototype.toString()

    MDN Web Docs の英語版 (2025年7月10日更新) ・ に本文を読んで確かめました

    radixに2から36までの整数を指定できること、数値が負のときは符号を保ったまま出力し、radixが2であっても2の補数ではなく符号付きの文字列になることが明記されていること。

  • MDN Web Docs BigInt

    MDN Web Docs の英語版 (2026年9月2日更新) ・ に本文を読んで確かめました

    BigIntはNumberの安全な範囲 (MAX_SAFE_INTEGERなど) を超えて表せない整数値を表すための型で、すべてのBigInt値は符号つきであることが書かれていること。「桁数に上限が無い」とは書かれていないので、本文ではその言い方をしていない。

  • MDN Web Docs JavaScript Lexical grammar (Numeric literals)

    MDN Web Docs の英語版 ・ に本文を読んで確かめました

    2進数リテラルは0bまたは0Bの接頭辞に続けて0と1が続く形で、それ以外の文字が出た時点でリテラルが終わると定められていること。BigIntリテラルは桁数に上限のない整数 (arbitrary precision) として扱われると書かれていること。

  • Python 3 ドキュメント int.to_bytes() / int.from_bytes()

    Python 3 の英語版 ・ に本文を読んで確かめました

    signed引数が、整数を2の補数で表すかどうかを決めること。signedがFalse (既定) で負の整数を渡すとOverflowErrorになることが書かれていること。

次の一歩

数の変換だけなら、ここまでで足ります。基数変換の考え方を基本情報技術者試験の過去問で確かめたい人、自分でアプリを作れるようになりたい人は、下から進んでください。

ツールの一覧へ戻る