[PHP]ビット演算を使ったフラグ処理(2進数のビット操作)

Facebook にシェア
Delicious にシェア
LINEで送る
Pocket

PHP を使った動的なサイトでは、「はい(true)」か「いいえ(false)」で表すことの出来るビットフラグを扱うことは多いと思います。
仮にオプション A~E があり、そのうち A, C, E だけ有効になっている状態を表す時、2進数を使ったほうが簡単な場合が有ります。

bit

<?php
// 定数の設定
class OptionInfo {
	const NONE = 0b0;
	const OPTION_A = 0b00001;
	const OPTION_B = 0b00010;
	const OPTION_C = 0b00100;
	const OPTION_D = 0b01000;
	const OPTION_E = 0b10000;
}

$option = OptionInfo::NONE; // 初期値

// フラグを設定
$option |= OptionInfo::OPTION_A;	// Aを有効にする
$option |= OptionInfo::OPTION_C;	// Cを有効にする
$option |= OptionInfo::OPTION_E;	// Eを有効にする

// 有効になっているフラグを表示
if($option == OptionInfo::NONE) echo 'NONE';
if($option & OptionInfo::OPTION_A) echo 'A';
if($option & OptionInfo::OPTION_B) echo 'B';
if($option & OptionInfo::OPTION_C) echo 'C';
if($option & OptionInfo::OPTION_D) echo 'D';
if($option & OptionInfo::OPTION_E) echo 'E';
出力結果: ACE

A, C, E が有効の時、2進数表記では「10101」のようになります。
それぞれ A=00001, B=00010, C=00100, D=01000, E=100000 という割り当てをしています。
わかりやすくするために定数としてクラスの形で名前をつけています。
特定のビットの 有効/無効 を切り替えるには次のようにします。

・指定したフラグをオン

$option |= OptionInfo::OPTION_A;

・指定したフラグをオフ
※右辺の「~」に注意

$option &= ~OptionInfo::OPTION_A;

・指定したフラグを反転(XOR)

$option ^= OptionInfo::OPTION_A;

フラグがオンになっているかを調べる場合次のようにします。

if($option & OptionInfo::OPTION_A)


Similar Posts:




  • This entry was posted in PHP and tagged . Bookmark the permalink.

    コメントを残す

    メールアドレスが公開されることはありません。