====== 論理シフトと算術シフト(数式的な説明) ======
===== ◆シフトとは? =====
* ビット列を左右にずらす操作。
* 左シフトは「×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)
を分けている。\\
これで「タイトル → プレイ → ゲームオーバー → タイトル」の流れを作れる。