Javascript 波浪号和二进制补码

IT技术 javascript bit-manipulation
2021-02-24 21:06:38

二进制补码方法- 生成-(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是从哪里来的?

6个回答

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

正如你所解释的,如果你想从一个正数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
@RoyiNamir 我已经用一些完整的计算更新了我的答案。现在清楚了吗?
2021-04-19 21:06:38
00000110在任何计算中都没有看到任何内容
2021-04-20 21:06:38
@RoyiNamir - 因为你甚至没有看过 -6 ......你的样本大约是计算 5 的二进制补码,这与(在某种程度上)反转 5 的每一位的结果无关。
2021-05-10 21:06:38

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

到目前为止,一切都很好。然而,~不是二进制的补码,而是二元求逆运算符。

5     = 0000 0101
flip  : 1111 1010

这是-6

这样说清楚了吗?

@RoyiNamir 如果在翻转后加 1,则二进制补码为 5,即 -5。如果这就是你想要的,那么是的。
2021-04-24 21:06:38
但是在翻转之后我们应该添加 1...no ?
2021-05-10 21:06:38

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

对于正数n

~n + 1 = -n
确实 -n=~n+1,或者~n + 1 = -n 'cos ~n 只是 1s 补码。
2021-04-27 21:06:38

二进制补码方法- 生成-(x + 1).

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

二进制补(翻转比特,添加1)是(-0厌恶)操作/编码,我们使用表达在纯位的负数(和导出它从其)。的补码x将生成-x

~5只不过是将位翻转0000 01011111 1010

为了确定 的值1111 1010,我们返回0000 0101并添加 1: 0000 0110 (-6)

这是正确的答案......当我阅读两个补语的所有其他错误定义时,我也这么认为
2021-04-19 21:06:38

波浪号(~) -

它只是翻转(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
MDN文档说,~整数转换为32位,丢弃更显著数字。我找到的最大数字 where~x === -x -12**31 - 1,这似乎证明了这一点。
2021-04-30 21:06:38