Страницы

Translate

суббота, 3 августа 2013 г.

Упражнение 2.8. Напишите функцию rightrot(х, n), которая циклически сдвигает x вправо на n разрядов.

Упражнение 2.8. Напишите функцию rightrot(х, n), которая циклически сдвигает x вправо на n
разрядов.

В этом задании я покажу два варианта решения и здесь я использую для отображения десятичных чисел в двоичном виде свой заголовочный файл.

Первый вариант.

#include <stdio.h>
#include "viewbin.h"

unsigned rightrot(unsigned x, int n);
int countbits(unsigned x);

int main()
{
    unsigned int x;
    int n;
    
    printf("Enter the number:\nx: ");
    scanf("%d", &x);
    bin(x);//преобразуем в двоичный вид
    printf("n: ");
    scanf("%d", &n);
    printf("\n%d\n", rightrot(x, n));
    bin(rightrot(x, n));
    return 0;
}

/*считаем количество занятых битов*/
int countbits(unsigned x)
{
    int count;
    for(count=1; x>=2; count++)
        x/=2;
    return count;
}


/*rightrot*/
unsigned  rightrot(unsigned x, int n)
{
    int rotbits, bitscount;
    bitscount = (countbits(x)-1);
    while(n--)
    {
        rotbits= x & 1;//запоминаем самый младшый бит
        x = x>>1;//сдвигаем ч на позицию вправо
        x = x | (rotbits<<bitscount);//ставим младший бит 
                                        //на место старшего
    }
    return x;
}

Результат:












Второй вариант:

#include <stdio.h>

unsigned int rightrot(unsigned int x, int n);
int countbits(unsigned x);

int main()
{
    unsigned int x;
    int n;
    
    printf("Enter the number:\nx: ");
    scanf("%d", &x);
    printf("n: ");
    scanf("%d", &n);
    printf("%d\n", rightrot(x, n));
    return 0;
}

/*считаем количество занятых битов*/
int countbits(unsigned x)
{
    int count;
    for(count=1; x>=2; count++)
        x/=2;
    return count;
}

/*rightrot(x, n)*/
unsigned  int rightrot(unsigned int x, int n)
{
    int bit, i;
    i = countbits(x);
    if(n>i)
        n %=i;
    bit = (x&((~((~0>>n)<<n))))<<(countbits(x)-n);//запоминаем n бит
    return (x>>n)|bit;
    
}

Результат:


Комментариев нет:

Отправить комментарий