How does this work?
The idea is to make abs(x)
use bitwise operators for integers (assuming 32 bit words):
y = x >> 31 (x + y) ^ y // This gives abs(x) (is ^ XOR)?
One way to find out the Absolute value of a number will be to check if the given value is negative or positive and if it's positive , then return n and if it's negative , then return n - 2*n .
Multiply any Number with using Bitwise Operator in C++ The left shift (<<) operator is used for the multiplication whereas the right shift (>>) is used for the division. The multiplication of two numbers x, y can be written as x * y = (x * 2) * (y / 2) if y is even else it's equal to x * y = (x * y) * (y / 2) + x.
The abs () function is a predefined function in the stdlib. h header file to return the absolute value of the given integers.
Assuming 32-bit words, as stated in the question:
For negative x
, x >> 31
is implementation-defined in the C and C++ standards. The author of the code expects two’s complement integers and an arithmetic right-shift, in which x >> 31
produces all zero bits if the sign bit of x
is zero and all one bits if the sign bit is one.
Thus, if x
is positive or zero, y
is zero, and x + y
is x
, so (x + y) ^ y
is x
, which is the absolute value of x
.
If x
is negative, y
is all ones, which represents −1 in two’s complement. Then x + y
is x - 1
. Then XORing with all ones inverts all the bits. Inverting all the bits is equivalent to taking the two’s complement and subtracting one, and two’s complement is the method used to negate integers in two’s complement format. In other words, XORing q
with all ones gives -q - 1
. So x - 1
XORed with all ones produces -(x - 1) - 1
= -x + 1 - 1
= -x
, which is the absolute value of x
except when x
is the minimum possible value for the format (−2,147,483,648 for 32-bit two’s complement), in which case the absolute value (2,147,483,648) is too large to represent, and the resulting bit pattern is just the original x
.
This approach relies on many implementation specific behavior:
x
is 32 bits wide. Though, you could fix this by x >> (sizeof(x) * CHAR_BIT - 1)
Example with 3 bits:
101 -> x = -3 111 -> x >> 2 101 + 111 = 100 -> x + y 100 XOR 111 -> 011 -> 3
This is not portable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With