1. 13 -> 1101
  2. 0 -> 0
  3. 1 -> 1
  4. 10 -> 1010
  5. 255 -> 11111111
  6. 1024 -> 10000000000
コース一覧
コンピューターサイエンス入門:理論編
10進数から2進数への変換

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

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

逆向きは、当てずっぽうになりやすい

前回は 2 進数を 10 進数にしました。今回は逆で、13 から 1101 を作ります。ところが逆向きは、急にやりにくくなります。

重みを大きいほうから当てはめる方法だと、「13 に 8 は入る、残り 5、4 も入る、残り 1」と進みます。悪くはありませんが、まず何ビット必要かを先に決めないと始まりません。13 なら 4 桁だと分かっても、1000000 を渡された瞬間に手が止まります。

桁数を先に決めなくてよい、もっと機械的な手順があります。

基数で割ると、いちばん右の桁が余りに出てくる

10 進数の 253 を 10 で割ると、商が 25 で余りが 3 です。余りは一の位そのもので、商は「一の位を捨てた残り」です。

2 進数でも同じです。2 で割った余りは必ず 0 か 1 になり、それが最下位の桁になります。商は最下位を捨てた残りなので、同じことをもう一度やれば次の桁が出ます。商が 0 になったら、もう桁はありません。

13 を追いかけると次のようになります。

プレーンテキスト

13 / 2 -> 商 6 余り 1 6 / 2 -> 商 3 余り 0 3 / 2 -> 商 1 余り 1 1 / 2 -> 商 0 余り 1

この「割って余りを拾う」形は、数の変換に限った話ではありません。秒数を時分秒に崩すときも、中身は同じ手順です。

Python

sec = 3725 print(sec % 60) # 5 秒 print(sec // 60 % 60) # 2 分 print(sec // 3600) # 1 時間

余りは、出てきた順と逆に並ぶ

最初に出た余りは最下位の桁で、最後に出た余りが最上位の桁です。拾った順のまま並べると 1011 になり、正解の 1101 と食い違います。

集め終わってから向きをそろえる、という一手間が必ず要ります。逆にすることを前提に集めるか、集めるたびに前へ差し込むか、どちらでも構いません。この一手間を忘れると、13 と 11 のように、たまたま左右対称な数だけ正解して、それ以外が全部ずれます。

0 を渡すと、1 回も割れない

0 は割る前から商が 0 です。「商が 0 になるまで繰り返す」という手順だと、繰り返しに一度も入らないので、余りが 1 つも集まりません。

欲しいのは 0 という 1 文字なのに、返るのは何も無い状態です。テストで最初に落ちるのはたいていここなので、手順の外で面倒を見てください。

割り算のほうにも注意が要ります。整数どうしの割り算が小数になる言語では、商が 6.5 のまま次へ進み、いつまでも 0 にならないことがあります。商は必ず整数に落としてください。

要件

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

入出力例

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

ヒント

n % 2 で最下位ビット、n // 2 (Math.floor(n / 2)) で残りを得る

余りを配列に push していき、最後に reverse して join する

while ループの条件は n > 0。n が 0 になった時点でループ終了

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • ビットAND演算でフラグ判定

    ビット単位の AND 演算を使って、指定したビットが立っているかを判定する関数を実装する。

  • OR / XOR でフラグを操作する

    ビット OR でフラグを立て、XOR でフラグを反転させる手法を学び、複数フラグの統合を実装する。

  • popcount で 1 のビット数を数える

    整数を 2 進数で表したときに含まれる 1 の個数 (popcount) を求める関数を実装する。

  • シフト演算で 2 倍 / 半分

    左シフトと右シフトで 2 のべき乗倍 / 除算を高速に行う仕組みを学び、シフト演算による倍率変換を実装する。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ビット2進数の1桁。0 か 1 のどちらか
  • テストバグを見つける工程
  • 関数処理に名前を付けて再利用できる単位
main.py
学習モード
エディタを読み込んでいます

メモ

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

⌘S で保存