循環移位運算

循環移位運算是把數值變成二進制然後進行循環移動的運算。

基本介紹

  • 中文名:循環移位運算
  • 外文名:Cyclic shift operation
  • 類型:計算機科學
  • 學科:跨學科
  • 屬性:運算
  • 特點:定次循環
介紹,代碼,

介紹

循環移位運算是把數值變成二進制然後進行循環移動的運算。用到循環移位的操作時,在彙編裡面是比較容易實現的,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); 
}

相關詞條

熱門詞條

聯絡我們