64 ビット変数の左循環回転を実行したいのですが、私のコントローラーは 8 ビットでしか動作しません。それは可能ですか?
質問する
202 次
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 に答える