| 6. Как реализовать циклический сдвиг? |
|
|
| Автор 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)) Однако, как быть, если надо сдвигать более чем на 1 разряд? Использовать вышеописанный макрос в цикле? Во многих случаях это приведет к неоправданному увеличению объема кода, лучше поступить так: #define rolb(x,y) ((x << y) | (x >> (8 - y))) В этих макросах осуществляется циклический сдвиг x на y разрядов. Важно помнить, что x - байтовая переменная, поэтому y не может принимать значения больше 7. Добавить в любимые (0) | Просмотров: 22990
Только зарегистрированные пользователи могут оставлять коментарии. |
||||
| « Пред. | След. » |
|---|
R785211844650
Z210696637574
E368177590409



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