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 |