1

我有对象,我只想根据不同的标准向访问者显示。该对象有一个位掩码,我定义了以下条件:

const FLAG_ALWAYS   = 0; // always show this item
const FLAG_LOGIN    = 1; // only display to logged in users
const FLAG_NOTLOGIN = 2; // only display to users not logged in
const FLAG_OTHER    = 4; // other criteria
const FLAG_NORTH    = 8; // GeoIP
const FLAG_SOUTH    = 16;

标志的组合当然是可能的,例如1+4+16or 2+4

一个项目可以在 3 种登录条件下显示,例如:已登录、未登录或两者兼有。因此我需要FLAG_NOTLOGIN.

我对FLAG_ALWAYS......应该是0,还是应该覆盖所有其他标志感到困惑4095

还是我应该删除FLAG_NOTLOGIN

4

2 回答 2

1

FLAG_ALWAYS 应该是所有其他标志的组合,并且不应该为零。不需要删除 FLAG_NOTLOGIN。

于 2014-04-29T11:36:24.533 回答
1

答案取决于您如何组合标准。有两种最简单的情况。

任何匹配,或组合。您设置的任何标志都将添加匹配项,更多标志更多匹配项。

在这种情况下,所有重置的标志 (0x0000) 将永远不会匹配。这意味着没有满足任何标准。

所有标志设置 (0xFFFF) 将导致大多数匹配。如果您有免费标准(其中一个已设置),标准将始终匹配。

Match 是这样实现的:0!=(filter & criteria) wherefilter是一组过滤条件,并且criteria是一组在多个条件下设置的相同标志。

所有匹配,AND 组合。您设置的任何标志都会过滤掉一些匹配项,更多的标志更少的匹配项。

在这种情况下,所有重置的标志将始终匹配。

所有设置的标志都将导致最少匹配。如果您有互斥标准(一组然后其他重置),则所有条件都将导致不匹配。

例如。你的旗帜:FLAG_LOGIN, FLAG_NOLOGIN. 用户可能登录或未登录,因此这两个条件永远不会满足,FLAG_LOGIN+FLAG_NOLOGIN也永远不会匹配,但0在任何情况下都会匹配,因为没有设置任何条件。

匹配是使用这个公式实现的:0==(all_flags & ~filter & ~criteria),这里filtercriteria与上面相同,并且all_flags设置了所有使用的标志,以排除未使用的位进行比较。(注意,表达式criteria == (filter & criteria)似乎更明显但错误,因为当条件中没有设置标志时它会导致不匹配)。

如果您的标志是1 | 4并且对象具有1 | 8,那么第一种情况将匹配(因为1满足条件并且一个就足够了),而第二种情况将不匹配(4不满足条件但您需要两者14

于 2014-04-29T12:24:26.730 回答