2

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

4

3 回答 3

6

您可以将它们写为传统转变的明显组合:

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

width你旋转的位数在哪里。

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

请注意,它适用于无符号并且如果宽度等于您正在处理的机器字中的位数(dsPIC 上的无符号 int 为 16)。

于 2010-11-17T22:02:30.217 回答
1

C中没有循环移位。(参考

如果性能很关键,内联汇编可能是要走的路。否则,您可以使用上面链接的文章中的代码。

于 2010-11-17T18:08:30.477 回答
0

dsPIC 有 GCC 吗?如果它具有循环移位的内在特性,请查看其手册。另一个选项是内联汇编。

于 2010-11-17T18:09:20.130 回答