2

64 ビット変数の左循環回転を実行したいのですが、私のコントローラーは 8 ビットでしか動作しません。それは可能ですか?

4

2 に答える 2

1

64 ビット変数がリトル エンディアンであると仮定します。その場で変更します。

void rol(unsigned char a[8], int b){
    unsigned char c[8];
    unsigned char t, u;
    int i, j;

    /* Clamp b to [0, 63] */
    b &= 63;

    /* First rotate by 0 to 7 whole bytes (0 to 56 bits in multiples of 8) */
    for(i=0, j=b/8;i<8;i++){
        c[j] = a[i];

        j++;
        j &= 7;
    }

    /* Second, rotate by 0 to 7 bits, depending on what's left */
    b &= 7;

    if(b){/* Shift by 1 to 7 bits using bitwise ops into output */
        for(i=0, j=7;i<8;i++){
            u = c[i] << (b);
            t = c[j] >> (8-b);

            a[i] = u | t;

            j++;
            j &= 7;
        }
    }else{/* Shift by 0 bits = copy into output */
        for(i=0;i<8;i++){
            a[i] = c[i];
        }
    }
}
于 2013-10-15T23:29:37.440 に答える
1

もちろん、そうすることが可能です。それがどれだけ効率的でなければならないかという問題です。

1 ビットのローテーションは、バイトを順次シフトし、各 8 ビット バイトから「シフト アウト」するビットを検査し、それを次の 8 ビット バイトに持ち越すことによって、自明に実装できます。

ビット単位のローテーションは、一連の1 ビット ローテーションnを実行することにより、「ダム」方式で実装できます。n

より「ばかげた」アプローチは、バイトn / 8時間全体の循環再割り当て (ローテーション) を実行してから、n % 8連続した 1 ビットのローテーションで終了することです。つまり、19 ビット ローテーション = 2 つのフルバイト ローテーションとそれに続く 3 つの 1 ビット ローテーションです。

また、64 ビット ワードでは、左に 63 ビット回転することは、右に 1 ビット回転することと同じであることに気付くかもしれません。 32 ビット。

ターゲット ワード サイズが 64 ビットに制限されている場合は、これで十分かもしれません。

于 2013-10-16T00:08:25.523 に答える