A shortcut method of forming the two's complement of a binary number is to copy bits from the right until a one-bit has been copied, then complement (invert) the remaining bits.
That's explained on SO here and also on Wikipedia.
What is not explained is why this shortcut works, that is, why does it produce the same result as inverting all the bits and adding one. So, my question is, why does this work?
It works because adding one to a binary number is accomplished by flipping all 1s to 0s from the right until a 0 is reached, flip that to 1 and stop (essentially carrying the overflow of adding 1 to 1).
So one method flips only the bits to the left of the first one, while the other flips all bits, then flips the first 1 (now 0) and the bits to the right of it back.
e.g.:
01000100
10111100 // copy bits until a 1 is reached, then flip the rest
vs
01000100
10111011 // invert all bits:
+ 1 // add one
10111100
Write the number as x10k (some string of bits followed by a 1 and then k zeroes).
Suppose you complement it and then add one, you'd get first y01k (where y is the complement of x), then the increment carries through the trailing ones and flips the zero back on, to y10k.
Which is the same thing as just complementing x and leaving the tail alone.
来源:https://stackoverflow.com/questions/34982608/why-does-this-twos-complement-shortcut-work