Как вращать биты в слове - PullRequest
2 голосов
/ 17 ноября 2010

Я использую dsPIC33F и GCC. Я хочу повернуть биты в слове один раз влево или вправо, например:

       MSB             LSB
input: 0101 1101 0101 1101
right: 1010 1110 1010 1110
left : 1011 1010 1011 1010

(Если неясно, LSB перемещается в позицию MSB для поворота вправо и наоборот.)

Мой процессор уже имеет команду поворота вправо (rrnc, rrc) и команду поворота влево (rlnc, rlc), поэтому я надеюсь, что компилятор оптимизирует это. Если нет, возможно, мне придется использовать встроенную сборку.

Ответы [ 3 ]

6 голосов
/ 18 ноября 2010

Вы можете написать их как очевидную комбинацию обычных сдвигов:

x rol N == x << N | x >> width-N
x ror N == x >> N | x << width-N

, где width - количество бит в числе, которое вы вращаете.

Интеллектуальный компилятор может (я думаю, что это будетбыть) обнаружить эту комбинацию и скомпилировать в инструкцию поворота.

Обратите внимание, что она работает для беззнаковых и, если ширина равна числу битов в машинном слове, с которым вы работаете (16 для беззнакового целого в dsPIC).

1 голос
/ 17 ноября 2010

Циркулярное смещение отсутствует в C. ( Ссылка )

Может потребоваться встроенная сборка, если производительность критична.В противном случае вы можете использовать код в статье, указанной выше.

0 голосов
/ 17 ноября 2010

Есть ли GCC для dsPIC? Посмотрите в его руководстве, есть ли у него свойственные круговые сдвиги. Другой вариант - встроенный asm.

...