PHP ビット演算子

パーミッションみたいに「〇〇を含む」ようなことをしたい。

作成日:2018-02-08, 更新日:2018-08-09

ビット積

・「$a & $b」 - $a および $b の両方にセットされているビットがセット

言葉で説明できないよ・・・。

パーミッションみたいに「〇〇を含む」ようなことをしたくて・・・

パーミッションは基本下記のような感じ。
・r - 1(読み込み権限)
・w - 2(書き込み権限)
・x - 4(実行権限)

例えば、
・権限「7」の人は「w」の権限を持っているか知りたい
・権限「5」の人は「w」の権限を持っているか知りたい
・・・みたいなコトをしたい。

define('PMS_R', 1);
define('PMS_W', 2);
define('PMS_X', 4);

$val = 5;
if ( $val & PMS_W ) {
   echo '「w」権限を持っている';
}
else {
   echo '「w」権限を持っていない';
}

組み合わせとサンプル、結果

ソース ($val & PMS_R) ($val & PMS_W) ($val & PMS_X)
echo (0 & PMS_○○○)? "含む": "含まない"; 含まない(0) 含まない(0) 含まない(0)
echo (1 & PMS_○○○)? "含む": "含まない"; 含む(1) 含まない(0) 含まない(0)
echo (2 & PMS_○○○)? "含む": "含まない"; 含まない(0) 含む(2) 含まない(0)
echo (3 & PMS_○○○)? "含む": "含まない"; 含む(1) 含む(2) 含まない(0)
echo (4 & PMS_○○○)? "含む": "含まない"; 含まない(0) 含まない(0) 含む(4)
echo (5 & PMS_○○○)? "含む": "含まない"; 含む(1) 含まない(0) 含む(4)
echo (6 & PMS_○○○)? "含む": "含まない"; 含まない(0) 含む(2) 含む(4)
echo (7 & PMS_○○○)? "含む": "含まない"; 含む(1) 含む(2) 含む(4)
echo (8 & PMS_○○○)? "含む": "含まない"; 含まない(0) 含まない(0) 含まない(0)

めも

上記の例だと「rwx」が下記のような内容。

10進数 2進数
r(読み込み権限) 1 0001
w(書き込み権限) 2 0010
x(実行権限) 4 0100

「(10進数)5」の場合「(2進数)0101」となり「r(0001)」「x(0100)」が条件に合う。

・・・良い感じに説明できない。なんとなくこんな感じ。

「6 & 0」の場合→両方とも同じ場所に「1」が無いので「偽」となる
10進数 2進数
6 1 1 0
0 0 0 0
「6 & 1」の場合→両方とも同じ場所に「1」が無いので「偽」となる
10進数 2進数
6 1 1 0
1 0 0 1
「6 & 2」の場合→両方とも2桁目が「1」なので「真」となる
10進数 2進数
6 1 1 0
2 0 1 0
「6 & 3」の場合→両方とも2桁目が「1」なので「真」となる
10進数 2進数
6 1 1 0
3 0 1 1
「6 & 7」の場合→両方とも2、3桁目が「1」なので「真」となる
10進数 2進数
6 1 1 0
7 1 1 1