Right Shift Negative Numbers in C++

We are going to learn how to right shift negative numbers in C++. Right shift is denoted by the operator “>>“.

Right shifting takes two operands (two numbers) and right shifts the bits of the first operand by the amount of the value of the second operand.

Syntax

x>>y
This will shift the variable x by y amount to the right. We take these variables as binary numbers, i.e, the representation of a number in 0s and 1s.

Example
Let us take a number as -25 and we are interested in right shifting this value. -25 in binary is 11100111. Our common understanding would be to shift this binary value to the right and add a 0 as MSB(Most significant bit). But this is the wrong approach. The MSB bit must be fixed at all times. With this approach, 1 at MSB will be fixed for our example.
Thus the right shifted value of -25 will be 11110011 which is -13 when converted back to decimal.

Example Code

#include<iostream>
using namespace std;
void print_bin(char num)
{
    int i;
    for(i=7; i>=0; i--)
    {
        if(num & 1<<i)
            cout<<"1";
        else
            cout<<"0";
    }
}

int main()
{
    char num1 = -25;
    char i;
    for(i=0; i<8; i++)
    {
        print_bin(num1 >> i);
        cout<<endl;
    }
    return 0;
}
Output:
11100111
11110011
11111001
11111100
11111110
11111111
11111111
11111111

Explanation

  • Whenever we get a right shift, we have to check whether the number is even or odd.
  • If even, divide the number by 2.
  • If odd, divide the number by 2 and add 1 to the result.
  • A function print_bin() is defined to convert the decimal number into a binary and then check the MSB.
  • The function checks and retains the MSB and shifts the other 7 bits.
  • In the main() function, num1 is defined as a character to store the binary converted value.
  • For loop is run 8 times to show each and every bit is shifted. Thus, we have 8 answers.
  • Each time the value is right shifted once.

Leave a Reply

Your email address will not be published. Required fields are marked *