3

//こんにちは、ビット演算でフラグを除外したいのですが、方法がわかりません://フラグは次のとおりです(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も設定されていると見なしますが、そうではありません。これを解決する方法がわかりません。

4

2 に答える 2

3

マスクは、生成のための新しい値と一致するのではなく、テストのために現在の値と一致するように意図されています。単一のフラグの存在をテストするか、単一のフラグのみを使用する場合は、そのフラグのみを使用してください。

于 2012-11-07T08:09:01.553 に答える
1

CURRENT_MODE_MASKオーバーラップしたくない場合は、1 に設定された共通ビットを共有しないようにCURRENT_AS_SELFします。たとえば、現在の値に合わせて 64 または 192 にCURRENT_AS_PATHNAME設定できます。CURRENT_MODE_MASK

于 2012-11-07T08:06:40.407 に答える