如何旋转单词中的位

Tho*_*s O 2 bit-manipulation pic dspic

我正在使用dsPIC33F和GCC.我想向左或向右旋转一个单词中的位,如下所示:

       MSB             LSB
input: 0101 1101 0101 1101
right: 1010 1110 1010 1110
left : 1011 1010 1011 1010
Run Code Online (Sandbox Code Playgroud)

(如果不清楚,LSB进入MSB的右侧旋转位置,反之亦然.)

我的处理器已经有一个旋转的权利(rrnc,RRC),并向左旋转指令(rlnc,RLC),所以我希望编译器将在优化这一点.如果没有,我可能要使用内联汇编.

Vov*_*ium 6

您可以将它们写成传统班次的明显组合:

x rol N == x << N | x >> width-N
x ror N == x >> N | x << width-N
Run Code Online (Sandbox Code Playgroud)

其中width是您旋转的位数.

智能编译器可能(我认为会)检测到这种组合并编译为旋转指令.

注意它适用于无符号,如果width等于您正在处理的机器字中的位数(对于dsPIC上的unsigned int,则为16).