如何旋转单词中的位

时间:2010-11-17 18:00:26

标签: bit-manipulation pic dspic

我正在使用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 个答案:

答案 0 :(得分:6)

你可以把它们写成传统轮班的明显组合:

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

其中width是您旋转的位数。

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

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

答案 1 :(得分:1)

C中没有循环移位(Reference

如果性能至关重要,

内联汇编可能是最佳选择。否则,您可以使用上面链接的文章中的代码。

答案 2 :(得分:0)

dsPIC有GCC吗?如果它具有循环移位的固有内容,请查看其手册。另一个选项是内联asm。