Two\'s complement method - generates -(x + 1)
.
for example when JavaScript encounters the Tilde he uses this method:
~5 = -(5+1) = -6
First of all, you need to realize that ~
is the bitwise flip operator, which is not the same as the negate operator -
. ~
does only do the bitwise flipping, but the negate operator -
does bitwise flipping and add one (for integers).
As you've explained, if yo want to go from a postive number n
to -n
using the two complement method you bitwise flip/not n and add 1. ~n is just the bit-wise not meaning that ~n=-n-1
.
For instance:
5 = 0000 0101
Flipped (~5) = 1111 1010
So, which number does 1111 1010
represent? Since the first digit is a 1 we know it's a negative value. To find which value, do
-(flip(1111 1010) + 1) =
-(0000 0101 + 1)
-(0000 0110) =
-6
Two's complement method - generates
-(x + 1)
.
Simply put, two's complement does not generate -(x + 1)
. One's complement does (i.e., ~ / bitwise NOT / flipping the bits).
Two's compliment (flip the bits, add 1) is the (-0 averse) operation/encoding we use to express a negative number in pure bits (and derive it therefrom). Two's complement of x
will generate -x
.
~5
is nothing more than flipping the bits 0000 0101
to 1111 1010
.
To determine the value of 1111 1010
, we flip back to 0000 0101
and add 1: 0000 0110 (-6)
.
~
is the Bitwise NOT operator (only inverts the bits of its operand).
For a positive number n
,
~n + 1 = -n
Tild(~) -
it is just flip(n). I.e. ~5 = flip(5). In java script numbers are always 64 bit signed. let us take Just 8 bit for reference,
5==> 0000 0101
~5 ==> filp(0000 0101)
~5 ==> 1111 1010 ==> -6
2' complement -
It's 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
~5 = -(5 + 1) = -6
so far so good. However, ~
is not the two's complement, it's the binary inversion operator.
5 = 0000 0101
flip : 1111 1010
which is -6
does that make it clear?