2

dsPIC33F と GCC を使用しています。次のように、単語内のビットを左または右に 1 回回転させたい:

       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は回転する数のビット数です。

インテリジェントコンパイラは、この組み合わせを検出し、ローテーション命令にコンパイルする場合があります(そうなると思います)。

unsignedで機能し、widthが処理しているマシンワードのビット数と等しい場合(dsPICのunsigned intの場合は16)に注意してください。

于 2010-11-17T22:02:30.217 に答える
1

C には循環シフトはありません。 (参照)

パフォーマンスが重要な場合は、インライン アセンブリが適している可能性があります。それ以外の場合は、上記のリンク先の記事のコードを使用できます。

于 2010-11-17T18:08:30.477 に答える
0

dsPIC 用の GCC はありますか? 循環シフトの組み込みがある場合は、マニュアルを参照してください。もう 1 つのオプションは inline asm です。

于 2010-11-17T18:09:20.130 に答える