// 你好,我想用位运算来排除一个标记,但是我不知道如何做: // 这里是标记(它们来自文件系统迭代器)
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
能否使用位运算符使该函数通过第三个测试用例 (应返回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 也已经设置了,尽管这并不是实际情况。我不知道该如何解决这个问题。
0000000011000000
。 - user254875486KEY_MODE_MASK
的值实际上并不正确,因为KEY_MODE_MASK & FOLLOW_SYMLINKS
返回一个真值结果,即使FOLLOW_SYMLINKS
与任何键标志都无关。因此,使用$any_key_flag_set = $fsiObj->getFlags() & $fsiObj::KEY_MODE_MASK;
将返回一个错误的结果。KEY_MODE_MASK
应该是3328(从其掩码中删除512),或者FOLLOW_SYMLINKS
应该是16384,以将其从3840掩码中移除。 - Anthony