有人可以解释下面的功能如何增加:
function increment (i) {
i ^= (i & ~-~i) | (~i & -~i)
return i
}
我想我知道javascript,但是当我看到上面的内容时,它会让我生气。
答案 0 :(得分:5)
布尔代数101。
首先,假设我们正在使用two's complement,这是一元减运算符-
的定义(也见脚注):
-A = ~A + 1
这是您的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 and ~Y) or (~X and Y)
形式,这意味着“X和Y中的一个必须为true才能使表达式为真,但不能同时为”,它是exclusive或(xor
)的定义,所以我们可以用X xor Y
替换它,获得:
i xor (i xor (i + 1))
我们更改关联(xor
是关联的),我们得到:
(i xor i) xor (i + 1)
i xor i
是一个矛盾(总是false
),所以我们得到:
false xor (i + 1)
请注意false xor X
的真值完全取决于X
,因此我们可以将上述内容重写为:
i + 1
因此RHS评估为i + 1
。我们在原始代码中替换它,我们得到:
function increment(i) {
i = i + 1
return i
}
瞧!
注意:如果我们想要完全正式,+
应该被正式化为另一个运营商。在这种情况下,我们可以安全地跳过定义并将其保留为黑盒子,因为我们不需要任何属性。唯一重要的是~
的优先级高于+
。
答案 1 :(得分:2)
以下是由my website
自动生成的较短校样i ^ (i & ~-~i | ~i & -~i)
definition of xor
i ^ i ^ -~i
xor with self
-~i
definition of two's complement
~~i + 1
double complement
i + 1
在“xor的定义”步骤中,使用定义x ^ y = x & ~y | ~x & y
,x
为i
,y
为-~i
。
在“两个补语的定义”步骤中,使用定义-x = ~x + 1
,x
为~i
。