//こんにちは、ビット演算でフラグを除外したいのですが、方法がわかりません://フラグは次のとおりです(filesystemiteratorから取得されます)
define('CURRENT_AS_FILEINFO', 0);
define('CURRENT_AS_SELF', 16);
define('CURRENT_AS_PATHNAME', 32);
define('CURRENT_MODE_MASK', 240);
define('KEY_AS_PATHNAME', 0);
define('KEY_AS_FILENAME', 256);
define('FOLLOW_SYMLINKS', 512);
define('KEY_MODE_MASK', 3840);
define('NEW_CURRENT_AND_KEY', 256);
define('SKIP_DOTS', 4096);
define('UNIX_PATHS', 8192);
ユーザーは、フラグの任意の組み合わせを設定できる可能性があります。CURRENT_AS_SELFまたはCURRENT_AS_PATHNAMEが設定されているかどうかを検出する必要があるため、これまでの関数は次のとおりです。
function containsPathnameOrSelfFlag($flags) {
if ($flags & (CURRENT_AS_PATHNAME | CURRENT_AS_SELF)) {
return true;
}
return false;
}
そしてここにテストスイートがあります:
var_dump(containsPathnameOrSelfFlag(CURRENT_MODE_MASK | CURRENT_AS_PATHNAME)); // true, ok
var_dump(containsPathnameOrSelfFlag(CURRENT_AS_FILEINFO)); // false, ok
var_dump(containsPathnameOrSelfFlag(CURRENT_MODE_MASK | CURRENT_AS_FILEINFO)); // true, but false was expected, because neither CURRENT_AS_SELF nor CURRENT_AS_SELF were set, so my function is wrong
ビット単位の演算子を使用して、関数に3番目のケースを渡すことは可能ですか(falseを返す必要があります)?
ここで私が見ている問題は、CURRENT_MODE_MASKのビットがCURRENT_AS_SELFとCURRENT_AS_PATHNAMEのビットとオーバーラップしていることです。
0000000000010000 : CURRENT_AS_SELF
0000000000100000 : CURRENT_AS_PATHNAME
0000000011110000 : CURRENT_MODE_MASK
0000000100000000 : KEY_AS_FILENAME
0000001000000000 : FOLLOW_SYMLINKS
0000111100000000 : KEY_MODE_MASK
0000000100000000 : NEW_CURRENT_AND_KEY
0001000000000000 : SKIP_DOTS
0010000000000000 : UNIX_PATHS
したがって、ユーザーがCURRENT_MODE_MASKをフラグに追加するたびに、私の関数はCURRENT_AS_SELFとCURRENT_AS_PATHNAMEも設定されていると見なしますが、そうではありません。これを解決する方法がわかりません。