Change sign using bitwise operators

bit-manipulation, int, performance

Solution

The speed difference between non-floating point (e.g. int math) addition/multiplication and bitwise operations is less than negligible on almost all machines.

There is no general way to turn an n-bit signed integer into its negative equivalent using only bitwise operations, as the negation operation looks like `x = (~x) + 1`, which requires one addition. However, assuming the signed integer is 32 bit you can probably write a bitwise equation to do this calculation. Note: do not do this.

The most common, readable way to negate a number is `x = -x`.

Problem

How to change the sign of int using bitwise operators? Obviously we can use `x*=-1` or `x/=-1`. Is there any fastest way of doing this? I did a small test as below. Just for curiosity... ``` public class ChangeSign { public static void main(String[] args) { int x = 198347; int LOOP = 1000000; int y; long start = System.nanoTime(); for (int i = 0; i < LOOP; i++) { y = (~x) + 1; } long mid1 = System.nanoTime(); for (int i = 0; i < LOOP; i++) { y = -x; } long mid2 = System.nanoTime(); for (int i = 0; i < LOOP; i++) { y = x * -1; } long mid3 = System.nanoTime(); for (int i = 0; i < LOOP; i++) { y = x / -1; } long end = System.nanoTime(); System.out.println(mid1 - start); System.out.println(mid2 - mid1); System.out.println(mid3 - mid2); System.out.println(end - mid3); } } ``` Output is almost similar to : ``` 2200211 835772 1255797 4651923 ```

Original source