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 波浪号和补码的主要内容,如果未能解决你的问题,请参考以下文章