1. 3 << 2 -> 12
  2. 1 << 0 -> 1
  3. 1 << 10 -> 1024
  4. 5 << 3 -> 40
  5. 0 << 5 -> 0
  6. 7 << 4 -> 112
  7. 1 << 20 -> 1048576
コース一覧
コンピューターサイエンス入門:理論編
シフト演算で 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分

シフト演算で 2 倍 / 半分

ビットシフトと桁あふれ

2 倍したいだけなのに、重みを全部足し直すのか

0011 を 2 倍したいとします。重みで考えると 2 + 1 が 4 + 2 になるので、答えは 0110 です。ここで、元と答えを見比べてください。桁の中身は何も変わっていません。1 が立っている場所が、そろって 1 つ左へずれただけです。

10 進数で 123 を 10 倍するときも、同じことをしています。右に 0 を 1 つ足して 1230 にするだけで、掛け算の筆算はしていません。基数が 2 なら、同じ動きが 2 倍になります。

左へずらすと、重みが 2 倍になる

桁の重みは、右から 1、2、4、8 と 2 倍ずつ増えていきます。だから 1 が 1 つ左へ動くと、その 1 が背負う意味が 2 倍になります。全部の桁がそろって動けば、数全体が 2 倍です。

<< はこれをそのまま命令にしたものです。

プレーンテキスト

0011 << 1 -> 0110 3 が 6 0011 << 2 -> 1100 3 が 12

2 つ動かせば 2 倍の 2 倍で 4 倍、3 つで 8 倍です。ずらした数だけ 2 を掛けたことになります。1 を 10 個ずらすと 1024、20 個ずらすと 1048576 で、これが 1 KB と 1 MB の正体です。

右へずらすと、落ちた桁は戻らない

>> は逆向きです。重みが半分になるので、数も半分になります。ただし右端から押し出された桁には行き場が無く、消えます。

プレーンテキスト

1100 >> 1 -> 0110 12 が 6 1100 >> 2 -> 0011 12 が 3 0111 >> 1 -> 0011 7 が 3

7 を半分にすると 3 です。3.5 にはなりません。落ちたのは重み 1 の桁だったので、結果として小数点以下を切り捨てた形になります。割り算というより「桁を捨てる操作」だと思っておくほうが、答えを外しません。

だから右へずらしてから左へ戻しても、元には戻りません。7 を右に 1 つ、左に 1 つ動かすと 6 です。捨てた桁は復元できないので、往復させる書き方はしないでください。

はみ出した先は、言語ごとに答えが割れる

左へずらしたとき、扱える幅からはみ出した桁がどうなるかは言語によって違います。JavaScript のビット演算は 32 ビットで行われるので、1 を 31 個ずらした時点で符号の桁に届き、正の数のつもりが負の数になります。

右へずらすときの左側の空きも同じです。多くの言語の >> は符号を保つように埋めるため負の数は負のままですが、JavaScript の >>> は 0 で埋めるので、同じ -8 でも結果が大きく変わります。ずらす量が大きいときと、負の数を渡すときは、その言語の幅を先に確かめてください。

要件

  1. n と k は 0 以上の整数 (k は 30 未満)
  2. ビット左シフト (<<) を使うこと。*, **, pow は使わない
  3. 戻り値は整数

入出力例

multiplyByPow2(3, 2) → 12 multiplyByPow2(1, 0) → 1 multiplyByPow2(1, 10) → 1024 multiplyByPow2(5, 3) → 40 multiplyByPow2(0, 5) → 0 multiplyByPow2(7, 4) → 112 multiplyByPow2(1, 20) → 1048576

ヒント

n << k はそのまま n を 2^k 倍する操作

n = 0 のときも結果は 0

k = 0 のときは n そのまま

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

関連レッスン

  • 16 進数から 10 進数への変換

    16 進数 (hexadecimal) の文字列を 10 進数の整数に変換する関数を実装し、4 ビット = 1 桁の関係を理解する。

  • 第 1 章まとめクイズ

    2 進数とビット演算の理解度を確認するまとめクイズ。

  • 文字 → ASCII コード

    1 文字を受け取り、その ASCII コード (整数) を返す関数を実装します。ord() 系の組み込みでバイト値の世界に触れます。

  • forループの実行回数を返す

    for ループを n 回まわすときに、本当に n 回実行されているのかを自分の手で数え、計算量の感覚を掴む。

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

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

  • JavaScriptWeb で動的な振る舞いを担う言語
  • ビット2進数の1桁。0 か 1 のどちらか
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

シフト演算で 2 倍 / 半分

⌘S で保存