I read that doing a `& 0x7fffffff`

masks just the sign bit and doesn't tampers with the other bits.

```
int a = Integer.MIN_VALUE;
System.out.println(a & 0x7fffffff);
```

But, this code outputs

```
0
```

instead of

```
2147483648
```

Why is that?

Negative numbers in Java are stored as twos complement. So a min value has sign bit set and all others not set. So what you do is:

```
10000000000000000000000000000000
& 01111111111111111111111111111111
```

When you clear the sign bit you get zero.

```
00000000000000000000000000000000
```

Removing the most significant bit makes sure you get a non-negative value. It does not ensure that the result is positive. (0 is non-negative as well.) Neither does it make sure that you get the absolute value of the negative value. (Which you never get.)

Actually it will result in the following value for any negative `int`

value: `negative_value - Integer.MIN_VALUE`

.

For the reasoning why it behaves like this you have to check how the two's complement is working: https://en.wikipedia.org/wiki/Two's_complement

User contributions licensed under CC BY-SA 3.0