我正在使用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),所以我希望编译器能够优化它。如果没有,我可能必须使用内联汇编。
答案 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。