10進数から2進数への変換
10進数から2進数への変換
このレッスンで分かること
- 10 進数 -> 2 進数の核となる発想は「
2で割って余りを集める」- 10 進数を 2 進数に変換する古典的な手法は、
2 で割り続けて余りを下から並べるというアルゴリズムです- 例として
13を 2 進数に変換してみます
10進数から2進数への変換 とは
10進数の整数を2進数の文字列に変換する関数を実装し、繰り返し2で割るアルゴリズムを学ぶ。本レッスンでは、10進数から2進数への変換 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
前のレッスンでは 2 進数の文字列を 10 進数に変換しました。今回はその逆方向、つまり 10 進数の整数を 2 進数の文字列に変換 する関数を作ります。コンピュータが内部でやっている処理を、人間の世界で再現する感覚です。
10 進数を 2 進数に変換する古典的な手法は、2 で割り続けて余りを下から並べる というアルゴリズムです。手計算でも紙とペンですぐ書ける、シンプルで美しい手順です。
10 進数 -> 2 進数の核となる発想は「
2で割って余りを集める」。これ以上単純な手順はない。
2 で割り続けるアルゴリズム
例として 13 を 2 進数に変換してみます。次のように 13 を 2 で割り続け、商 と 余り を記録していきます。
13 / 2 = 6 余り 16 / 2 = 3 余り 03 / 2 = 1 余り 11 / 2 = 0 余り 1
余りを 下から並べる と 1101 になります。10 進数 13 の 2 進数表現が 1101 であることが、前のレッスンの結果とも一致しています。
余りは必ず
0か1になる。なぜなら2で割っているから。
Mermaid 図でアルゴリズムを把握
図のポイント (テキスト併記)
- 図のとおり、商が
0になったら処理を終了し、それまで集めた余りを 逆順 に並べれば 2 進数表現になります
図のとおり、商が 0 になったら処理を終了し、それまで集めた余りを 逆順 に並べれば 2 進数表現になります。
Python での実装
Python
def decToBin(n):
if n == 0:
return "0"
bits = []
while n > 0:
bits.append(str(n % 2))
n = n // 2
return "".join(reversed(bits))n % 2 で余り、n // 2 で整数商を取ります。集めた bits リストを reverse してから join するのがポイントです。0 のときは特別扱いで "0" を返さないと、ループが回らずに空文字列が返ってしまいます。
JavaScript での実装
JavaScript
function decToBin(n) {
if (n === 0) return "0";
const bits = [];
while (n > 0) {
bits.push(String(n % 2));
n = Math.floor(n / 2);
}
return bits.reverse().join("");
}JavaScript には整数除算がないので、Math.floor(n / 2) で整数商を取得します。これを忘れて n / 2 のまま代入すると、小数になってループが終わらない可能性があります。
別解 - ビットシフトで取り出す
余りを取るのは n & 1、2 で割る のは n >> 1 でも同じことができます。次のレッスン以降で扱う ビット演算 の予習として見ておきましょう。
Python
def decToBin(n):
if n == 0:
return "0"
bits = []
while n > 0:
bits.append(str(n & 1))
n = n >> 1
return "".join(reversed(bits))n & 1 は n の最下位ビットを取り出す操作、n >> 1 は 1 ビット右にずらす操作です。意味は同じですが、ビット演算の方が圧倒的に高速です。CPU の内部命令 1 つで済むためです。
ビット演算は「
2の累乗の掛け算 / 割り算 / 余り」を CPU の最速命令で実行する方法。
よくある間違い
1 つ目は n == 0 のケースを忘れること。while n > 0 のループに入らないので、bits が空のままになり、空文字列が返ります。2 つ目は JavaScript で Math.floor を忘れる ケースです。13 / 2 は 6.5 であり、6 ではありません。3 つ目は 余りを逆順にし忘れる ケース。下から集めるアルゴリズムなので、必ず reverse してから join する必要があります。
やってみよう
255を変換すると11111111(8 ビットすべて1) になることを確認する。1024を変換すると10000000000(2^10) になる。2の累乗は常に1のあとに0が続く形になる。binToDec(decToBin(n)) == nがどんなnでも成り立つか試す。これは 可逆変換 の性質。- 負の数を入力するとどうなるか考えてみる。今回の実装では負数は扱わないが、
2 の補数という重要なテーマがある。
2 進数 <-> 10 進数の変換ができるようになると、16 進数 や 8 進数 も同じ要領で扱えます。基数が変わるだけで原理は同じです。
よくある質問
Q. 進数変換はなぜプログラミングで必要なのですか?
A. コンピュータは内部で 2 進数を扱うため、ビット演算やメモリ操作で 2 進・16 進の理解が必須です。色コード(#FF8800)、ファイル権限(0755)、IP アドレスのサブネット計算など、実務でも進数変換に触れる機会は多くあります。
Q. 10 進数を 2 進数に変換するアルゴリズムは?
A. 数を 2 で割り続け、余りを下から並べると 2 進表現になります。例えば 13 → 6 余 1 → 3 余 0 → 1 余 1 → 0 余 1 で 1101 です。多くの言語は bin() / Integer.toBinaryString() などの組み込みがあるため、それを使うのが安全です。
Q. Base64 はなぜ 4/3 倍に膨らむのですか?
A. 3 バイト(24 ビット)を 4 文字(各 6 ビット)に変換するため、データ量が 4/3 倍になります。8 ビット境界の任意バイト列を ASCII 印字可能文字だけで安全に運ぶための仕組みで、メール添付や URL 内のバイナリ埋め込みで使われます。
次のレッスン
次は ビットAND演算でフラグ判定 に進みましょう。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- 10進数から2進数 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. 10進数から2進数 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- n は 0 以上の整数であると仮定して良い
- 組み込みの基数変換関数 (bin / toString(2) / Integer.toBinaryString) は使わない
- n が 0 のときは '0' を返すこと
入出力例
test-cases.txt
decToBin(13) → "1101"
decToBin(0) → "0"
decToBin(1) → "1"
decToBin(10) → "1010"
decToBin(255) → "11111111"
decToBin(1024) → "10000000000"