【问题标题】:Bitmasks vs if..then in JavaScript位掩码与 JavaScript 中的 if..then
【发布时间】:2017-01-17 06:09:56
【问题描述】:

我正在开发一个应用程序,该应用程序在不同的地方包含大量标志检查,例如

if (a && b && c) { func1() } 
else if (a && !b && c) { func2() }
else if (!a && b && !c) { func3() }
...

有时一个序列中可能有 10 个检查。

当我有超过 3 张支票时,这看起来相当庞大。 我阅读了有关按位运算和bitmasks technique 的信息,我认为这可以给我一个优雅的解决方案。

不过,我想知道在不同级别的程序员工作的实际项目中使用这些做法是否是一种好习惯。尽量不要成为一个聪明人,而是让代码更优雅但更容易阅读,我应该继续使用if...else还是应该开始使用按位运算?

【问题讨论】:

  • 恕我直言,你的队友应该学习按位运算。也就是说,我们不能说这实际上是一个不错的选择,因为您没有提供真实世界的示例:-|
  • 我会说这取决于位掩码的暴露程度。给定a, b, c 的掩码,您的队友是否需要编写mask = mask ^ 2 以将b 设置为false,或者您是否会提供像set_param( name, value ) 这样的抽象并在后台处理XORing?您如何确保每个人都跟踪十个参数的顺序?

标签: javascript bitwise-operators


【解决方案1】:

是的,我认为按位是更好的解决方案。

const ACTIONS = {
  0: func0,
  1: func1,
  2: func2,
  3: func3,
  4: func4
  // ...
}

ACTIONS[a | b | c]()

【讨论】:

    【解决方案2】:

    您可能会发现使用带有 二进制文字switch 块作为大小写标签更清晰:

    switch (foo){
    case 0b111: /*corresponds to true-like a, b, and c*/
        func1();
        break;
    case 0b101: /*corresponds to true-like a and c*/
        func2();
        break;
    

    等等,其中fooabc 的适当函数,可能使用4 * a + 2 * b + c 之类的东西生成。

    【讨论】:

    • 请记住,案例的数量受整数大小的限制。例如,在某些情况下,您将无法测试超过 32 个值。
    • 你不是说 32 个独立的标志吗?这为您提供了可能案例的 2 的 32 次幂!
    • 我的意思是 32 个“参数”,抱歉 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多