Главная arrow Начинающим arrow FAQ по языку Си arrow 6. Как реализовать циклический сдвиг?  
13.01.2025 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация
Админцентр
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

6. Как реализовать циклический сдвиг? Печать E-mail
Рейтинг: / 26
ХудшаяЛучшая 
Автор ARV   
18.12.2009 г.
Операция циклического сдвига заключается в том, что бит, выталкиваемый слева (при сдвиге влево) переносится в самый младший разряд числа, а при сдвиге вправо наоборот, выталкиваемый справа переносится в самый старший разряд. То есть биты как бы путешествуют по кругу. В Си нет оператора, который бы выполнял циклический сдвиг, но используя простые сдвиги и двоичные битовые операции легко получить их аналоги. Циклический сдвиг байта на 1 разряд влево получается так:
var = (var << 1) | (var >> 7);

В этом примере значение переменной сдвигается влево на 1 разряд, а значение старшего бита переменной (который будет вытолкнут влево при сдвиге) переносится в младший разряд операцией сдвига вправо на 7 разрядов.

Для сдвига вправо на 1 разряд надо поступить аналогично:

var = (var >> 1) | (var << 7);

Удобно создать макросы для циклических сдвигов:

#define rolb_1(x) ((x << 1) | (x >> 7))
#define rorb_1(x) ((x >> 1) | (x << 7))

Однако, как быть, если надо сдвигать более чем на 1 разряд? Использовать вышеописанный макрос в цикле? Во многих случаях это приведет к неоправданному увеличению объема кода, лучше поступить так:

#define rolb(x,y) ((x << y) | (x >> (8 - y)))
#define rorb(x,y) ((x >> y) | (x << (8 - y)))

В этих макросах осуществляется циклический сдвиг x на y разрядов. Важно помнить, что x - байтовая переменная, поэтому y не может принимать значения больше 7.


Добавить в любимые (0) | Просмотров: 22672

  Ваш коментарий будет первым

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.

 
« Пред.   След. »
Полезные материалы по сходным темам
Кто на сайте?
Помощь on-line
BannerFans.com