論理シフトと算術シフト(数式的な説明)

  • ビット列を左右にずらす操作。
  • 左シフトは「×2」、右シフトは「÷2」と似ている動きをする。

ただし、「符号を持つ整数」を扱う場合は注意が必要。


  • 空いたビットは 必ず 0 で埋める。
  • ビットを動かすだけで、符号は考えない。
  • そのため 符号付きの計算では値がおかしくなる

例:

8ビットで -4 を表す場合(2の補数表現):
11111100 (-4)

右に1ビット論理シフト:
01111110 = +126  ← 本当は -2 になるべきだが、全然違う値になる!

  • 左端(符号ビット)を維持するようにシフトする。
  • 正の数なら 0 を埋め、負の数なら 1 を埋める。
  • そのため、符号付き整数で「÷2」「×2」に対応できる

例:

8ビットで -4 を表す場合(2の補数表現):
11111100 (-4)

右に1ビット算術シフト:
11111110 = -2   ← 正しく ÷2 になった!

  • 左シフト(論理でも算術でも同じ)
    • → 2倍に相当する(例: 3 « 1 = 6)
  • 右シフト
  • 論理シフト → 符号が崩れて、正しい ÷2 にならない場合がある
  • 算術シフト → 符号を保持して、正しく ÷2 になる

  • 符号なし整数 → 論理シフトを使う(ビット操作に便利)
  • 符号付き整数 → 算術シフトを使う(÷2, ×2 が正しく動く)

ゲームループとシーン管理

ゲームは止まらずに動き続けるプログラムです。 毎フレームごとに以下を繰り返します。

  • Init : 準備
  • Update : 入力や動きの処理
  • Draw : 画面に描く
while(ゲームが終わるまで){
    Init();    // 準備
    Update();  // 動きや入力の処理
    Draw();    // 画面に描く
}

ゲームには「場面」があります。

  • タイトル画面
  • プレイ画面
  • ゲームオーバー画面

これらを state(状態) として変数に持っておきます。

state = { title, play, gameover }

[タイトル画面] → ボタン押す → [プレイ画面]
[プレイ画面] → ミスした → [ゲームオーバー画面]
[ゲームオーバー画面] → ボタン押す → [タイトル画面]

enum State { TITLE, PLAY, GAMEOVER };
State state = TITLE;
 
while (true) {
    switch (state) {
        case TITLE:
            UpdateTitle();
            DrawTitle();
            if (Startボタン押した) state = PLAY;
            break;
 
        case PLAY:
            UpdatePlay();
            DrawPlay();
            if (ミスした) state = GAMEOVER;
            break;
 
        case GAMEOVER:
            UpdateGameOver();
            DrawGameOver();
            if (ボタン押した) state = TITLE;
            break;
    }
}

  • ゲームは ゲームループで同じ処理を繰り返している
  • その中で 「今の場面(state)」を見て処理を変える
  • state が TITLE, PLAY, GAMEOVER のどれかによって、
    • 入力の処理(Update)
    • 画面の描画(Draw)

を分けている。

これで「タイトル → プレイ → ゲームオーバー → タイトル」の流れを作れる。

  • game-engineer/classes/2025/game-algorithm/first-term/09-12x.txt
  • 最終更新: 5カ月前
  • by root