【超便利!】昔のファミコンはすべてこうだ、MySQL ビット演算で複数フラグ管理する方法

データベース(MySQL)

■演算子
& :論理積 (例:$x & $y )
|  :論理和 (例:$x | $y、-$z)
^ :排他的論理和(例:$x ^ $y)
<<  :$x を $y ビット左にシフト(例:$x << $y)
>>  :$x を $y ビット右にシフト(例:$x >> $y)
~  : $x のビットを反転(例:~$x)

 

状態異常表

# 状態異常名 状態異常物理名 2 進数 10 進数
1 通常 NORMAL 000000 0
2 死亡 DEATH 000001 1
3 POISON 000010 2
4 睡眠 SLEEP 000100 4
5 石化 PETRIFIED 001000 8
6 混乱 CONFUSION 010000 16
7 麻痺 PARALYSIS 100000 32

道具表

# 道具名 道具物理名 2 進数 説明
1 不死鳥の尾 FUSHICHONOO 000001 死亡状態を回復
2 毒消し DOKUKESHI 000010 毒状態を回復
3 眠眠打破 MINMINDAHA 000100 睡眠状態を回復
4 万能薬 BANNOUYAKU 111110 死亡以外の状態異常を回復

(引用:http://tetsuwo.tumblr.com/post/133001449227/php-bitmask-flags-control

 

■フラグ管理用のテーブルを作成する

CREATE TABLE user_statuses (
  user_id INT UNSIGNED,
  status TINYINT UNSIGNED DEFAULT 0
);

TINYINT(UNSIGNED) は 0 ~ 255(8bit)までなので 8 つのフラグを管理できる。

もちろん、データの型を多くすれば管理できるフラグも増えます

■ユーザー追加
INSERT INTO user_statuses VALUES(1, 0);

 

■毒を追加
UPDATE user_statuses SET status = status | 0b000010 WHERE user_id = 1;

■毒追加を確認する
SELECT user_id, status, CONV(status, 10, 2) FROM user_statuses;

 

■麻痺を追加
UPDATE user_statuses SET status = status | 0b100000 WHERE user_id = 1;

■麻痺を確認する
SELECT user_id, status, CONV(status, 10, 2) FROM user_statuses;

 

■毒消しを使う
UPDATE user_statuses SET status = status & ~0b000010 WHERE user_id = 1;

■毒消し効果を確認する
SELECT user_id, status, CONV(status, 10, 2) FROM user_statuses;

 

■万能薬を使う
UPDATE user_statuses SET status = status & ~0b111110 WHERE user_id = 1;

■万農薬の効果を確認する
SELECT user_id, status, CONV(status, 10, 2) FROM user_statuses;

 

豆情報:PHP関数

bindec() – 2 進数 を 10 進数に変換する