这个函数如何递增?

时间:2014-07-03 11:21:33

标签: javascript bit-manipulation increment

有人可以解释下面的功能如何增加:

function increment (i) {
  i ^= (i & ~-~i) | (~i & -~i)
  return i
}

我想我知道javascript,但是当我看到上面的内容时,它会让我生气。

2 个答案:

答案 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 & yxiy-~i

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