Programming

Library Links

  • Libpurple:Library of pidgin (im client)

フラグ

あるファイルを扱う上で,あるソフトには次のような制約の設定があったとします。

設定項目 Yes/No
読み込みを許可 Yes
追加を許可 Yes
上書きを許可 No
削除を許可 Yes

こんな場合,フラグを使うと,これらの設定値を1つの整数で表すことができます。

あるビットの値が1ならば Yes,0ならば No と決めておき,各ビットを次のように割り当てたとします。

項目
2^{0}の位 読み込みの許可(許可なら1/拒絶なら0)
2^{1}の位 追加の許可(許可なら1/拒絶なら0)
2^{2}の位 上書きの許可(許可なら1/拒絶なら0)
2^{3}の位 削除の許可(許可なら1/拒絶なら0)

こうすると,例えば「読み込み,追加」の設定を Yes にしたときの設定値は, 0 \times 2^{3} + 0 \times 2^{2} + 1 \times 2^{1} + 1 \times 2^{0} = 3 = 11_{2} となるし, 他にも「削除,上書き,読み込み」を Yes にしたならば, 1 \times 2^{3} + 1 \times 2^{2} + 0 \times 2^{1} + 1 \times 2^{0} = 13 = 1101_{2} となります。

でも,じゃぁどうやって,各項目が Yes かどうか確かめるのか。

これは,各ビットの AND(論理積)を求めれば良いわけです。

一応 AND演算(プログラミング言語では,しばしば & と表される)の真理値表を載せておくと,

 A   B  A & B
0 0 0
0 1 0
1 0 0
1 1 1

ってなるので, 例えば2番目の例で「上書き」設定が Yes かどうか調べるには,

$conf = 13;
 
if (0 !== ($conf & pow(2, 2)))
   echo "読み込みできます。";
else
   echo "読み込みできません!";

とかすると

13 = 1 \underline{1} 01_2
2^2 = 4 = 0 \underline{1} 00_2
より
1101_2 & 0100_2 = 0100_2 \ne 0

なので,調べられる。ちなみに,pow は \mathrm{pow}(x, n) = x^n って関数。 (コードでは !== という比較演算子を使ったけど,普通 0 は FALSE(偽) として扱われるので 0 !== は要らない…んだけど, 特にPHPの比較演算子については,一度キチンと押さえておくことをオススメします。知らないとデバッグで苦労するかも。)


おなじみの Unix系OSのファイルパーミッションは,755 とか 644 とかの8進数表記ですよね。 「所有者・グループ・その他ユーザー」という各ユーザークラスのパーミッションを,8進数の各桁の数字で表現しています。

それぞれの桁(つまりユーザークラス)で,

  • 1=2^0=001_2を足すと実行権限付与
  • 2=2^1=010_2を足すと書き込み権限付与
  • 4=2^2=100_2を足すと読み込み権限付与

となるわけで,この組み合わせで2^3=8通りのファイル操作権限を表現してるわけです。


Now loading some news...