Albert Leibnitz
Albert Leibnitz

Reputation: 43

Rotation of binary number in C

I have an issue i can't solve. The code below should get a number from the user and a number of rotations. The code should calculate the number after the rotations. For negative number of rotations the code should rotate the number left and for positive number of rotation the code should rotate the number right.

For example: for the input x=1010111011111011

my_rotate(x, -3) will return 0111010111011111 my_rotate(x, 3) will return 0111011111011101

Here is the code i wrote so far:

#include <stdio.h>


unsigned short my_rotate(unsigned short, char);


int main()
{
    unsigned short num, res;
    char rotations;


    printf("\nPlease enter a number and number of rotations\n");
    scanf("%hu %d", &num, &rotations);


    res = my_rotate(num, rotations);

    return 0;
}

unsigned short my_rotate(unsigned short a, char b)
{
   unsigned short bitsNum = sizeof(unsigned short) * 8;
   unsigned short temp1, temp2, result;


   if(b == 0)
      return a;

   else if(b < 0)
   {
    temp1 = a << (bitsNum + b);
    temp2 = a >> (-b);
    result = temp1 + temp2;
   }

   else  /* b > 0 */
   {        
    temp1 = (a >> (bitsNum - (unsigned short)b));
    temp2 = (a << (unsigned short)b);   
    result = temp1 + temp2; 
   }

  return result;

}

I always get 0 as a result and i don't know why. What's wrong with my code?

Upvotes: 1

Views: 341

Answers (2)

chux
chux

Reputation: 154272

@bruno well explained a problem with input.


A rotation count may exceed +/- bitsNum, so a good first step is to limit the rotation count.

unsigned short my_rotate(unsigned short a, int b) {
   unsigned short bitsNum = sizeof(unsigned short) * 8;

   //add
   b %= bitsNum;

   ....

Highly portable code would not use bitsNum as that is derived by the size of unsigned short (and assumes 8 bits/char) and an unsigned short could have padding bits. Certainly this is more of a rare machine concern. Code should derive the bit width based on USHRT_MAX instead.

Upvotes: 0

bruno
bruno

Reputation: 32596


in main :

unsigned short num, res;
char rotations;


printf("\nPlease enter a number and number of rotations\n");
scanf("%hu %d", &num, &rotations);

the last argument of scanf must be a pointer to an int (format is %d) but you give the address of a char, the behavior is undefined. Use an int for rotations for the format %d


In my_rotate b is a char and you do if(b < 0), the result depends if the char are signed or not, type n with signed char if you expect a char to be signed


If rotations is an int and b a signed char :

  • 44795 (1010111011111011) and -3 produce 30175 being 111010111011111

  • 44795 (1010111011111011) and 3 produce 30685 being 111011111011101

as you expected.

Note for me an unsigned short is on 16 bits, of course the result is not the same if short are on a different number of bit.

Upvotes: 2

Related Questions