Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Absolute value abs(x) using bitwise operators and Boolean logic [duplicate]

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)? 
like image 835
beta_me me_beta Avatar asked Mar 09 '20 13:03

beta_me me_beta


People also ask

How do you use Bitwise Operators to find absolute value?

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 .

How do you multiply a number by two Bitwise Operators?

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.

Which of the following command is used to take the absolute value of a number absolute of abs of Mod of modulus of?

The abs () function is a predefined function in the stdlib. h header file to return the absolute value of the given integers.


2 Answers

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.

like image 110
Eric Postpischil Avatar answered Sep 16 '22 11:09

Eric Postpischil


This approach relies on many implementation specific behavior:

  1. It assumes that x is 32 bits wide. Though, you could fix this by x >> (sizeof(x) * CHAR_BIT - 1)
  2. It assumes that the machine uses two's complement representation.
  3. the right-shift operator copies the sign bit from left to right.

Example with 3 bits:

101 -> x = -3 111 -> x >> 2  101 + 111 = 100 -> x + y  100 XOR 111 -> 011 -> 3 

This is not portable.

like image 35
Ayxan Haqverdili Avatar answered Sep 17 '22 11:09

Ayxan Haqverdili