Implementation of +,-,*,/ with bitwise operator

Summary

The article explores implementing core arithmetic operations—addition, subtraction, multiplication, and division—solely with bitwise operators. Addition is performed iteratively, combining XOR for sum bits and left-shifted AND for carry bits until no carries remain. Subtraction is then built upon this by adding the two's complement of the subtrahend. Multiplication utilizes repeated addition and left-shifting based on the bits of one operand, while division is achieved through successive subtractions. These bitwise approaches are valuable for specific performance scenarios or solving programming challenges that restrict standard arithmetic operators.

There is a question asked on Stackoverflow : Divide a number by 3 without using *,/,+,-,% operators. This question is an Oracle interview question. Some people give excellent answers. You can go there and take a look. Usually we need to use bitwise operators to do this kind of implementations. Here I want to show you ways to implement +,-,*,/ with bitwise operators.

A bitwise operation operates on one or more bit patterns or binary numerals at the level of their individual bits. It is a fast, primitive action directly supported by the processor, and is used to manipulate values for comparisons and calculations. On simple low-cost processors, typically, bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition. While modern high-performance processors usually perform addition and multiplication as fast as bitwise operations the latter may still be optimal for overall power/performance due to lower resource use. Some bitwise operators used frequently are <<(left shift),>>(right shift),~(complement),^(xor).


Come back to the implementation:


1. Add

int add(int x,int y){
    int a,b;
    do{
        a=x&y;
        b=x^y;
        x=a<<1;
        y=b;
    }while(a);
    return b;
}

The positions that generate a carry and the positions that don’t generate a carry. In each run, the newly generated carrys will be added to the corresponding positions.

2. Subtraction

int negate(int x){
    return add(~x,1);
}

int sub(int x,int y){
    return add(x,negate(y));
}

We can use the addition function implemented above here, first we implement how to get a negative number of a positive number. The ~x is to get the 1's complement of x and then by adding 1, we get the 2's complement number. This number will be the negative number of x.

Ok, then substration is just a number adds another number's negative number.

3. Multiplication

int mul(int x, int y){
    int m=1, z =0;
    if(x<0){
        x=negate(x);
        y=negate(y);
    }

    while(x>=m && y) {
        if (x &m) z=add(y,z);
        y <<= 1; m<<= 1;
    }
    return z;
}

The detail explanation for this implementation can be found in :Adding Two Numbers With Bitwise and Shift Operators. Here if x<0, we need to convert it to a positive number, otherwise, the result will be 0.

4. Division

int divide(int x,int y){
    int c=0,sign=0;

    if(x<0){
        x=negate(x);
        sign^=1;
    }
    
    if(y<0){
        y=negate(y);
        sign^=1;
    }

    if(y!=0){
        while(x>=y){
            x=sub(x,y);
            ++c;
        }
    }
    if(sign){
        c=negate(c);
    }
    return c;
}


If both x and y are positive numbers, then we will going to a while loop. Basically, what the loop does is to subtract y from x if x>=y, the loop will end until x

Note : The addition and multiplication implementations are from : Adding Two Numbers With Bitwise and Shift Operators.

DIVISION BITWISE OPERATOR SHIFT ADD SUBTRACT MULTIPLICATION

  RELATED

  COMMENTS

3
Anonymous
Mar 22, 2016 at 12:25 pm

Very good examples and clear explanation.Thnx for the post.

Anonymous
Jan 3, 2017 at 9:43 am

division :/ 

Anonymous
Jul 12, 2017 at 7:51 am

Hii !!!

Umm !!! Will it work for floating point numbers?