Javascript Tilde&两个补码

时间:2012-09-09 07:45:25

标签: javascript bit-manipulation

Two's complement method - 生成-(x + 1)

例如,当JavaScript遇到Tilde时,他使用此方法:

~5 = -(5+1) = -6.

很好 - 让我们更深入。

现在让我们谈谈二元补语法。

5        = 0000 0101
Flip     = 1111 1010
add one  = 1111 1011

所以1111 1011-5

怎么样?

再次:翻转:

0000 0100 

添加一个:

0000 0101

所以它是-5

那么这与~5=-6如何解决?

-6来自何处?

5 个答案:

答案 0 :(得分:14)

首先,您需要意识到~是按位翻转运算符,它与否定运算符-不同。 ~只执行按位翻转,但是否定运算符-按位翻转并添加一个(对于整数)。

正如你所解释的那样,如果你想使用二补码方法从正数n转到-n,你按位翻转/不是n并添加1.~n只是位-wise不代表~n=-n-1

例如:

5               = 0000 0101
Flipped (~5)    = 1111 1010

那么,1111 1010代表哪个数字?由于第一个数字是1,我们知道它是负值。要找到哪个值,请执行

-(flip(1111 1010) + 1) =
-(0000 0101 + 1)
-(0000 0110) =
-6

答案 1 :(得分:8)

~5 = -(5 + 1) = -6

到目前为止一切顺利。但是,~不是二进制补码,而是二元求逆运算符。

5     = 0000 0101
flip  : 1111 1010

是-6

这是否清楚了?

答案 2 :(得分:3)

~是Bitwise NOT运算符(仅反转其操作数的位)。

对于正数n

~n + 1 = -n

答案 3 :(得分:2)

  

Two's complement method - 生成-(x + 1)

简单地说,两个补码不会生成-(x + 1)。一个补码就是(即〜/按位NOT /翻转位)。

两个赞美(翻转位,加1)是我们用来表示纯位中的负数(并从中导出)的(-0 averse)运算/编码。 x的两个补码将生成-x

~5只不过是将0000 0101转换为1111 1010

要确定1111 1010的值,我们会回到0000 0101并添加1:0000 0110 (-6)

答案 4 :(得分:0)

Tild(〜) -

它只是翻转(n)。即~5 =翻转(5)。在java脚本中,数字始终是64位签名。让我们以8位为参考,

 5==> 0000 0101 
~5 ==> filp(0000 0101)
~5 ==> 1111 1010 ==> -6 

2'补充 -

这是filp(n)+ 1。

5 ==> 0000 0101
2's complement of 5 ==> flip(0000 0101) + 0000 0001
2's complement of 5 ==> 1111 1010 + 000 0001
2's complement of 5 ==> 1111 1011