【问题标题】:Why do we need to perform bitwise AND to a bit field when branching inside a switch statement为什么我们需要在 switch 语句中分支时对位域执行按位与
【发布时间】:2019-03-01 10:13:09
【问题描述】:

我真的不明白为什么我们需要在下面的代码中按位应用AND by BindingFlags.Types

switch (binding.flags & BindingFlags.Types) {
    case BindingFlags.TypeElementAttribute:
      setElementAttribute(view, binding, renderNode, binding.ns, name, value);
      break;
    case BindingFlags.TypeElementClass:
      setElementClass(view, renderNode, name, value);
      break;
    case BindingFlags.TypeElementStyle:
      setElementStyle(view, binding, renderNode, name, value);
      break;
    case BindingFlags.TypeProperty:
      const bindView = (def.flags & NodeFlags.ComponentView &&
                        binding.flags & BindingFlags.SyntheticHostProperty) ?
          elData.componentView :
          view;
      setElementProperty(bindView, binding, renderNode, name, value);
      break;
  }

这是BindingFlags的定义:

export const enum BindingFlags {
  TypeElementAttribute = 1 << 0,
  TypeElementClass = 1 << 1,
  TypeElementStyle = 1 << 2,
  TypeProperty = 1 << 3,
  SyntheticProperty = 1 << 4,
  SyntheticHostProperty = 1 << 5,
  CatSyntheticProperty = SyntheticProperty | SyntheticHostProperty,

  // mutually exclusive values...
  Types = TypeElementAttribute | TypeElementClass | TypeElementStyle | TypeProperty
}

有人可以澄清一下吗?

【问题讨论】:

  • 这取决于binding.flags 可以假设的值。请告诉我们好吗?您认为位掩码是多余的还是您不明白的地方?

标签: javascript typescript bitmask


【解决方案1】:

我真的不明白为什么我们需要在下面的代码中通过 BindingFlags.Types 应用逻辑与:

这是按位 AND (&amp;),而不是逻辑 AND (&amp;&amp;)。

您需要它来过滤掉其他位(例如SyntheticProperty)。 BindingFlags.Type 仅包含 TypeXYZ 位。

例如,如果binding.flags 同时具有SyntheticProperty (0b00010000) 和TypeElementClass (0b00000010),则其值为0b00010010。由于switch 只需要匹配类型的标志,它使用BindingFlags.Types (0b00001111) 和&amp; 来屏蔽非类型值。 0b00010010 & 0b00001111 是 0b0001000,所以它匹配 SyntheticProperty 大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多