12

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

4

6 回答 6

20

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

正如您所解释的,如果您想从一个正数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
于 2012-09-09T07:53:39.120 回答
9

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

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

5     = 0000 0101
flip  : 1111 1010

这是-6

这说明清楚了吗?

于 2012-09-09T07:55:06.133 回答
3

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

对于正数n

~n + 1 = -n
于 2012-09-09T08:00:36.367 回答
2

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

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

二的补码(翻转位,加 1)是我们用来以纯位表示负数(并从中派生)的(逆)操作/编码-0x将生成的二进制补码-x

~5无非是将位翻转0000 01011111 1010.

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

于 2018-01-22T00:18:05.550 回答
0

波浪号(~) -

它只是翻转(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
于 2017-04-10T09:50:35.830 回答
0

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

于 2021-12-09T04:01:50.650 回答