Javascript 这个函数是如何递增的?

Javascript 这个函数是如何递增的?,javascript,bit-manipulation,increment,Javascript,Bit Manipulation,Increment,有人能解释一下下面的heck函数是如何递增的吗 function increment (i) { i ^= (i & ~-~i) | (~i & -~i) return i } 我想我知道javascript,但当我看到上面的内容时,我很生气。布尔代数101 首先,假设我们正在使用,这是一元减运算符-的定义(也请参见脚注): 这是您的RHS表达式,添加了一些额外的括号,没有快捷方式赋值,所有运算符都以扩展形式提供,以提高可读性: i xor ((i and ~(-(~i

有人能解释一下下面的heck函数是如何递增的吗

function increment (i) {
  i ^= (i & ~-~i) | (~i & -~i)
  return i
}
我想我知道javascript,但当我看到上面的内容时,我很生气。

布尔代数101

首先,假设我们正在使用,这是一元减运算符
-
的定义(也请参见脚注):

这是您的RHS表达式,添加了一些额外的括号,没有快捷方式赋值,所有运算符都以扩展形式提供,以提高可读性:

i xor ((i and ~(-(~i))) or (~i and -(~i))
我们应用第一个关系:

i xor ((i and ~(~~i + 1)) or (~i and (~~i + 1))
补码运算符
~
是幂等的,这意味着
~~i
等于
i
,因此我们简化:

i xor ((i and ~(i + 1)) or (~i and (i + 1)))
xor
运算符的第二项具有
(X和~Y)或(~X和Y)
形式,这意味着“X和Y中的一个必须为真,表达式才为真,但不是两者都为真”,这正是异或(
xor
)的定义,因此我们可以将其替换为
xor Y
,获得:

i xor (i xor (i + 1))
我们更改关联(
xor
是关联的),得到:

(i xor i) xor (i + 1)
function increment(i) {
    i = i + 1
    return i
}
i xor i
是一个矛盾(总是
false
),因此我们得到:

false xor (i + 1)
请注意,
false xor X
的真值完全取决于
X
,因此我们可以将上述内容重写为:

i + 1
因此,RHS的计算结果为
i+1
。我们将其替换为原始代码,得到:

(i xor i) xor (i + 1)
function increment(i) {
    i = i + 1
    return i
}


注意
+
如果我们想完全正式,就应该正式化为另一个操作符。在这种情况下,我们可以安全地跳过定义并将其保留为一个黑盒,因为我们不需要它的任何属性。唯一重要的是
~
的优先级高于
+

这里有一个由

在“xor的定义”步骤中,使用定义
x^y=x&~y | ~x&y
,其中
x
i
y
-~i


在“定义两个补码”的步骤中,使用了定义
-x=~x+1
,其中
x
~i

提示:
~i
-i+1
在2的补码中。下面是一些阅读内容:或者@user3477950我想
~i
-i-1
@athms我想OP知道Javascript,问题集中在为什么这个复杂的表达式作为增量工作。可能使用
0
而不是
false
?@Bergi所有的表达式都应该是(或多或少)布尔代数表达式,而不是JS代码(虽然它们也是有效的JS):)但它们实际上是在“布尔数组”上操作的-所以
[false*32]
:-)哇,所有这些甚至可以用
返回i++
正确吗?@MBottens:No(后缀陷阱#1)代替<代码>返回++i如果有。但
返回i+1
很简单,不幸的是,很难看到网站上“xor定义”到底取代了什么。也许你可以用更多的颜色?@Bergi这是个好主意,我会看看我能做些什么(不过需要一段时间)