Javascript 这个函数是如何递增的?
有人能解释一下下面的heck函数是如何递增的吗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
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这是个好主意,我会看看我能做些什么(不过需要一段时间)