介紹
循環移位運算是把數值變成
二進制然後進行循環移動的運算。用到循環移位的操作時,在彙編裡面是比較容易實現的,ror,rol指令就行了。利用位運算進行循環移位操作比較容易理解。如果不是循環移位,使用x<<n(左移n位),x>>n右移n位。
循環移位也容易理解。比如我們有個1位元組的數: x = 10111110。現在需要對其循環右移4位。也就是最後結果為x = 11101011。其實思路就是分離數據,我們需要提取出前四位1011,後四位1110。其實我們需要兩個數的或操作,也就是00001011,11100000,我們只要得到這兩個數然後讓他們就行或操作:00001011|11100000 =11101011。把10111110 右移4位變為00001011(x>>4),把10111110左移4位變為11100000(x<<4),注意移位後的“空格”是用0填充的。最後執行或操作。
循環左移和上面的分析是一樣的。
假如數據為無符號的數,長度為N,需要循環移動n位。可以用下面的公式:
循環左移n位: (x>>(N - n) ) | (x<<n);
循環右移n位: (x<<(N - n) ) | (x>>n)。
代碼
將循環右
移寫成一個函式rightrot,每次循環右移一位,直到移完n位為止。在main()函式中輸入a和n,然後調用以下函式。
#include
unsigned rightrot(unsigneda,intn)
{
int rb;
while(n-->0)
{ rb=(a&1)>1;
a=a|rb;
}
return(a);
}
main()
{
unsigned rightrot(unsigned a,int n);
unsigned inta,b;
int n;
printf("enteraandn:");
scanf("%x,%x",&a,&n);
printf("a=%x,n=%d\n",a,n);
b=rightrot(a,n);
printf("b=%x\n",b);
}