Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 20
1

Циклический сдвиг разрядов числа

11.03.2013, 20:53. Показов 10425. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, у меня есть программа
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/* ЗАДАНИЕ
    Выполнить циклический сдвиг в заданную пользователем сторону на некоторое
    количество разрядов в пределах определённой группы разрядов, количество
    которых  и номер младшего разряда в группе задаются с клавиатуры.
    Для unsiged int.
*/
 
//подключение библиотек
#include <conio.h>
#include <stdio.h>
#include <conio.h>
 
//главная функция
void main()
{
    unsigned int num; //данное число
    int low, count; //номер младшего разряда, количество разрядов группы
    int side, dist; //сторона сдвига, кол-во разрядов сдвига
    int i; //номер разряда
    unsigned int result; //результат - число
 
    //выводим заголовок, вводим данные
    clrscr();
    printf("ПРОГРАММА ВЫПОЛНЯЕТ ЦИКЛИЧЕСКИЙ СДВИГ.\n");
    printf("\n");
    printf("Введите число типа unsigned int: ");
    scanf("%u",&num);
 
    do{
        printf("Введите номер младшего разряда в группе (0..15): ");
        scanf("%u",&low);
    }while(low>15);
 
    do{
        printf("Введите количество разрядов группы (0..16): ");
        scanf("%u",&count);
    }while(low+count>16);
 
    do{
        printf("Выберите сторону: 1-влево, 2-вправо. ");
        scanf("%u",&side);
    }while(side!=1&&side!=2);
 
    do{
        printf("Введите количество разрядов сдвига (0..16): ");
        scanf("%u",&dist);
    }while(dist>16);
 
    //сдвиг вправо - это сдвиг влево на остальное количество разрядов
    if(side==2) dist=count-dist;
 
    printf("\n");
 
    //выводим все разряды числа
    printf("Число в двоичном виде:   \t");
    for(i=15; i>=0; i--)
        printf("%u",(num>>i)&1);
    printf("\n");
 
    //обнуляем результат
    result=0;
    //цикл для каждого разряда исходного числа
    for(i=0; i<=15; i++){
        //номер разряда в результате
        int k=i;
        //если разряд входит в группу
        if(i>=low && i<low+count)
            //вычисляем новое место разряда в результате сдвига
            k=(((i-low)+dist)%count)+low;
        //если значение разряда = 1, то прибавляем новое значение к результату
        if(num&(1<<i))
            result+=(1<<k);
    }
 
    //выводим все разряды результата
    printf("Результат в двоичном виде: \t");
    for(i=15; i>=0; i--)
        printf("%u",(result>>i)&1);
    printf("\n");
 
    //выводим результат как число, ждём нажатие клавиши
    printf("Результат: %u.\n",result);
    getch();
}

вы не могли бы помочь, объяснить часть программы:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//обнуляем результат
    result=0;
    //цикл для каждого разряда исходного числа
    for(i=0; i<=15; i++){
        //номер разряда в результате
        int k=i;
        //если разряд входит в группу
        if(i>=low && i<low+count)
            //вычисляем новое место разряда в результате сдвига
            k=(((i-low)+dist)%count)+low;
        //если значение разряда = 1, то прибавляем новое значение к результату
        if(num&(1<<i))
            result+=(1<<k);
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2013, 20:53
Ответы с готовыми решениями:

Циклический сдвиг числа на k позиций
Что-то никак задачка не получается. Сдвигать просто массив циклически умею, но никак не получается...

Циклический сдвиг шестнадцатеричного числа
Здравствуйте ! Помогите пожалуйтса?! Дано длинное целое неотрицательное число. Выполнить...

Циклический сдвиг двоичного представления числа на К битов влево
Помогите решить Дано короткое целое (2 байта) неотрицательное число. Выполнить циклический...

Циклический побитовый сдвиг числа вправо на указанное количество бит, но только для нечетных битов
Реализовать циклический побитный сдвиг числа вправо на указанное число(n), но только для нечетных...

1
35 / 35 / 13
Регистрация: 21.02.2013
Сообщений: 90
12.03.2013, 13:18 2
Цыклический сдвиг влево:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef unsigned long ULI;
/**
 * @brief   This function is cyclically shift to the left 
 * @param   [in]    Number which will be shifted 
 * @param   [in]    on some bits
 * @return  ULI (unsigned long int)
 */
ULI ShiftLeft(const ULI number, const short digit) 
{
    return 
        ( (number<<digit) |
          (number>>( (sizeof(ULI)<<3) - digit) ) );
}
digit - на какое количество розрядов надо сделать сдвиг, перед тем как его передать можешь его сравнивать со своими условиями
0
12.03.2013, 13:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2013, 13:18
Помогаю со студенческими работами здесь

Циклический сдвиг матрицы
Собственно, есть задание: Осуществить циклический сдвиг элементов квадратной матрицы размером М х...

Циклический сдвиг битов
Я понимаю конечно, что тема уже надоела... Но объясните мне плз!!! Есть функция якобы циклического...

Битовые поля, циклический сдвиг
Задание такое: Используя описание union нужно наложить unsigned char на битовую структуру....

Битовые операции, циклический сдвиг
в принципе идея понятна, двигаемся (в моем примере против часовой) битами в лево, те что пропадают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru