論理シフトと算術シフト(数式的な説明)
◆シフトとは?
- ビット列を左右にずらす操作。
- 左シフトは「×2」、右シフトは「÷2」と似ている動きをする。
ただし、「符号を持つ整数」を扱う場合は注意が必要。
◆論理シフト(Logical Shift)
- 空いたビットは 必ず 0 で埋める。
- ビットを動かすだけで、符号は考えない。
- そのため 符号付きの計算では値がおかしくなる。
例:
8ビットで -4 を表す場合(2の補数表現): 11111100 (-4) 右に1ビット論理シフト: 01111110 = +126 ← 本当は -2 になるべきだが、全然違う値になる!
◆算術シフト(Arithmetic Shift)
- 左端(符号ビット)を維持するようにシフトする。
- 正の数なら 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)
を分けている。
これで「タイトル → プレイ → ゲームオーバー → タイトル」の流れを作れる。