How to get absolute (integer) only use bit operators and +-*/.(In gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) )
- if number >= 0 , then number >> 31 == 0
- if number < 0 , then number >> 31 == 0xFFFFFFFF
If some number exclusive or( xor ) 0xFFFFFFFF means each bit becomes its “opposite” number. (1 becomes 0, and 0 becomes 1).And If a number xor 0x00000000 means nothing happened to this number. So:
- number ^ 0xFFFFFFFF = ~number
- number ^ 0x00000000 = number
In this question, you should also know something about complement number(see two’s complement). When a number is negative, |number| = ~number +1 or you can use |number| = !number + 1. When a number is positive, |number| = number.
If you know above, then the goal of |x| = (x(x>>31))+(~(x>>31)+1).
(x(x>>31)) means:
- x >= 0, x^(x>>31) = x^0x00000000 = x
- x < 0, x^(x>>31) = x^0xFFFFFFFF = ~x
And (~(x>>31)+1)means:
- x >= 0, ~(x>>31)+1 = 0xFFFFFFFF+1 = 0
- x < 0, ~(x>>31)+1 = 0x00000000+1 = 1
And we should take care of those brackets, because the priorities of operators are: ~ > */ > + - > bit operators(&,,|)
| Level | Operator | Description | Grouping |
|---|---|---|---|
| 1 | :: | scope | Left-to-right |
| 2 | () [] . -> ++ – dynamic_cast static_cast reinterpret_cast const_cast typeid | postfix | Left-to-right |
| 3 | ++ – ~ ! sizeof new delete | unary (prefix) | Right-to-left |
| * & | indirection and reference (pointers) | ||
| + - | unary sign operator | ||
| 4 | (type) | type casting | Right-to-left |
| 5 | .* ->* | pointer-to-member | Left-to-right |
| 6 | * / % | multiplicative | Left-to-right |
| 7 | + - | additive | Left-to-right |
| 8 | << >> | shift | Left-to-right |
| 9 | < > <= >= | relational | Left-to-right |
| 10 | == != | equality | Left-to-right |
| 11 | & | bitwise AND | Left-to-right |
| 12 | ^ | bitwise XOR | Left-to-right |
| 13 | | | bitwise OR | Left-to-right |
| 14 | && | logical AND | Left-to-right |
| 15 | || | logical OR | Left-to-right |
| 16 | ?: | conditional | Right-to-left |
| 17 | = *= /= %= += -= >>= <<= &= ^= |= | assignment | Right-to-left |
| 18 | , | comma | Left-to-right |