Вращение двоичного числа в C - PullRequest
0 голосов
/ 03 марта 2019

У меня есть проблема, которую я не могу решить.Код ниже должен получить число от пользователя и количество поворотов.Код должен рассчитывать число после поворотов.Для отрицательного числа вращений код должен поворачивать число влево, а для положительного числа вращений код должен поворачивать число вправо.

Например: для входа x = 1010111011111011

my_rotate (x, -3) вернет 0111010111011111 my_rotate (x, 3) вернет 0111011111011101

Вот код, который я написал до сих пор:

#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;

}

Я всегда получаю 0 в результате, и я нене знаю почему.Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

@ bruno хорошо объяснил проблему со входом.


Число оборотов может превышать +/- bitsNum, поэтому хорошим первым шагом является ограничение числа оборотов.

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

   //add
   b %= bitsNum;

   ....

В очень переносимом коде не будет использоваться bitsNum, поскольку он получается из размера из unsigned short (и предполагает, что 8 бит / char) и unsigned short может иметьбиты заполнения.Конечно, это скорее редкая проблема машины.Код должен получить битовую ширину на основе USHRT_MAX.

0 голосов
/ 03 марта 2019

in main :

unsigned short num, res;
char rotations;


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

последний аргумент scanf должен быть указателем на int (формат %d), но вы даете адрес char , поведение не определено.Используйте int для вращений для формата %d


In my_rotate b - это char и вы делаете if(b < 0), результат зависит от того, подписан символ или нет, введите n с символом со знаком , если вы ожидаете, что символ будетсо знаком


Если поворотов является int и b a знаковым символом :

  • 44795 (1010111011111011) и -3 производят 30175, являясь 111010111011111

  • 44795 (1010111011111011) и 3 производят 30685, являясь 111011111011101

как и ожидалось.

Обратите внимание, что unsigned short на 16 битах, конечно, результат не тот, если short на другом числебит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...