【问题标题】:not sure about my bitmask logic不确定我的位掩码逻辑
【发布时间】:2014-04-29 11:23:37
【问题描述】:

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

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+162+4

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

我对@9​​87654325@ 感到困惑...应该是0,还是应该涵盖所有其他标志,例如4095

或者我应该删除FLAG_NOTLOGIN 吗?

【问题讨论】:

  • 设置多个标志时,条件是标志的合取(满足所有条件),还是析取(满足任何条件)?
  • @Vovanium 所有用户标志都必须出现在对象标志中。一个用户可以有标志FLAG_LOGIN,一个对象可以有FLAG_LOGINFLAG_NOTLOGIN

标签: bit-manipulation flags bitmask bitflags


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 当用户有标志(例子)1 | 4(=5),并且对象有1 | 2 | 4 | 8(=15)然后is user allowed to see the object? (5 & 15) == 5评估为真,用户被允许查看对象.所以我的情况是第一个:-)我认为这是一个误解,但你的解释是好的和正确的!
  • 嗯,看看你的标志是1 | 4,对象有1 | 8,那么第一种情况会匹配(因为1条件满足,一个就足够了),第二种情况不匹配(4 条件不满足,但您需要14)。这就是区别
  • (5 & 9) !== 5 因此不允许用户查看对象。如果用户拥有1 | 4 并且对象拥有1 | 4 | 8,则允许用户查看该对象。这是预期的逻辑。
【解决方案2】:

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

【讨论】:

  • 答案取决于标准的组合方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
相关资源
最近更新 更多