Javascript 波浪号和补码

Posted

技术标签:

【中文标题】Javascript 波浪号和补码【英文标题】:Javascript Tilde & Two's complement 【发布时间】:2012-09-02 11:22:24 【问题描述】:

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

例如,当 javascript 遇到波浪号时,他使用此方法:

~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 来自哪里?

【问题讨论】:

developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/… ~ 运算符是按位非。所以预期的结果。 二进制补码 ~5 + 2 【参考方案1】:

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

正如您所解释的,如果您想使用二进制补码方法从正数 n 变为 -n,您可以按位翻转/非 n 并加 1。~n 只是按位没有意义那个~n=-n-1

例如:

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

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

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

【讨论】:

我在任何计算中都没有看到任何00000110 @RoyiNamir - 因为你甚至没有看过 -6...你的样本围绕着计算 5 的二进制补码,这与(在一定程度上)反转 5 的每一位的结果无关。 @RoyiNamir 我已经用一些完整的计算更新了我的答案。现在清楚了吗?【参考方案2】:

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

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

5     = 0000 0101
flip  : 1111 1010

这是-6

这样说清楚了吗?

【讨论】:

但是在翻转之后我们应该添加 1...no ? @RoyiNamir 如果在翻转后加 1,则得到 5 的补码,即 -5。如果这就是你想要的,那么是的。【参考方案3】:

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

对于一个正数n

~n + 1 = -n

【讨论】:

确实是-n=~n+1,或者~n + 1 = -n 'cos ~n 只是补码。【参考方案4】:

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

简单地说,二进制补码不会生成-(x + 1)。一个补码可以(即~/按位非/翻转位)。

Two 的补码(翻转位,加 1)是 (-0 averse) 操作/编码,我们使用纯位表示负数(并从中派生)。 x 的补码将生成 -x

~5 只不过是将0000 0101 的位翻转为1111 1010

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

【讨论】:

这是正确答案...当我阅读了所有其他关于两个补码的错误定义时,我也这么认为【参考方案5】:

Tild(~) -

它只是翻转(n)。 IE。 〜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

【讨论】:

MDN doc 表示~ 将整数转换为 32 位,丢弃更重要的数字。我发现~x === -x -1 的最大数字是2**31 - 1,这似乎证明了这一点。【参考方案6】:

5 = 0000 0101

翻转 = 1111 1010

转化率细分 1111 1010

0 x 2^0 = 0
1 x 2^1 = 2
0 x 2^2 = 0
1 x 2^3 = 8
1 x 2^4 = 16
1 x 2^5 = 32
1 x 2^6 = 64
- 1 x 2^7 = -128

所以-128+64+32+16+8+0+2+0 = -6

【讨论】:

以上是关于Javascript 波浪号和补码的主要内容,如果未能解决你的问题,请参考以下文章

带波浪号和星号的 code128 条码

赋值号和printf

~~(“双波浪号”)在 Javascript 中做了啥?

~~(“双波浪号”)在 Javascript 中的作用是啥?

将音乐生成波浪图形,JavaScript Html5

html5 + javascript播放波浪声音