【问题标题】:Is it possible with bitwise operators to do the equivalent of "++i, --j" in one fell swoop?位运算符是否可以一举完成相当于“++i,--j”的操作?
【发布时间】:2015-10-29 15:05:58
【问题描述】:

所以我想做类似的事情

for ( var i = 0, j = (arr.length - 1); i < j; (++i; --j;) )

即有两个操作,++i--j,作为for循环体执行后发生的东西,相当于

for ( var i = 0, j = (arr.length - 1); i < j; )
{
    // ...
    ++i; --j;
}

是否可以在 for 循环的声明中完成所有操作? ij 上是否有一些奇特的按位运算可以在单个语句中执行 ++i; --j

【问题讨论】:

  • JavaScript 有逗号操作符吗?
  • @DavidEisenstat 确实如此。

标签: javascript algorithm optimization bit-manipulation bitwise-operators


【解决方案1】:

位运算符确实可以解决问题:

for(var i=0,j=arr.length-1; i < j; i++ & j--){
    alert(arr[i]+arr[j]);
}

这是因为 ++ 和 -- 有返回值。根据您是否将它们用作前置或后置运算符,返回值是递增之前或之后的值。 (与减量运算符类似)

由于 JavaScript 没有强类型,您可以将整数值与位运算符一起使用。数字 != 0 将被解释为真,0 将被解释为假。 & 运算符用于计算两个操作数。 && 只会在左侧评估为真时评估右侧。

不用说,所有这些都是不必要的把戏,应该用更干净的代码代替。在您的示例中,只需将 j 替换为 arr.length-i-1 即可,您不必处理两个循环变量。

【讨论】:

    【解决方案2】:

    逗号运算符是您要找的吗?

    for(var i=0, j=10; i<j; i++, j--)
    

    【讨论】:

      【解决方案3】:

      虽然其他答案清楚地显示了如何实现您想要的,但如果可以避免的话,我宁愿建议您不要使用两个计数器。在这里你可以使用arr.length - j - 1 而不是i

      【讨论】:

        猜你喜欢
        • 2012-04-23
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 2021-11-11
        • 2018-07-17
        相关资源
        最近更新 更多