10進数から2進数への変換

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

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 進数に変換してみます。次のように 132 で割り続け、余り を記録していきます。

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

余りを 下から並べる1101 になります。10 進数 13 の 2 進数表現が 1101 であることが、前のレッスンの結果とも一致しています。

余りは必ず 01 になる。なぜなら 2 で割っているから。

Mermaid 図でアルゴリズムを把握

diagram (will load when visible)

図のポイント (テキスト併記)

  • 図のとおり、商が 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 & 12 で割る のは 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 & 1n の最下位ビットを取り出す操作、n >> 1 は 1 ビット右にずらす操作です。意味は同じですが、ビット演算の方が圧倒的に高速です。CPU の内部命令 1 つで済むためです。

ビット演算は「2 の累乗の掛け算 / 割り算 / 余り」を CPU の最速命令で実行する方法。

よくある間違い

1 つ目は n == 0 のケースを忘れること。while n > 0 のループに入らないので、bits が空のままになり、空文字列が返ります。2 つ目は JavaScript で Math.floor を忘れる ケースです。13 / 26.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 つができることを確認しましょう。

  1. 10進数から2進数 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 10進数から2進数 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. n は 0 以上の整数であると仮定して良い
  2. 組み込みの基数変換関数 (bin / toString(2) / Integer.toBinaryString) は使わない
  3. n が 0 のときは '0' を返すこと

入出力例

test-cases.txt

decToBin(13)"1101" decToBin(0)"0" decToBin(1)"1" decToBin(10)"1010" decToBin(255)"11111111" decToBin(1024)"10000000000"

ヒント

main.py
main.py
学習モード

メモ

10進数から2進数への変換

⌘S で保存