天天看點

《C程式設計語言》 練習2-8

問題描述

  練習 2-8 編寫一個函數rightrot(x, n),該函數傳回将x循環右移(即從最右端移出的位将從最左端移入)n(二進制)位後所得到的值。

  Write a function 

rightrot(x,n)

 that returns the value of the integer 

x

 rotated to the right by 

n

 bit positions.

解題思路

   這個題目我感覺可以有兩種了解方式

   第一種

   就是預設二進制位數,前面沒有多餘的0來補位,比如111的二進制是1101  111,我就認為題目的函數對1101  111進行循環右移,就是把最右端的數字放到最左端,即 1101  111

   第二種

   這一種了解方式是比較符合實際的,就是計算機中二進制數位是有規定的,比如有的計算機是32位

   那麼111的二進制就不是1101  111了,而是

   0000  0000 0000 0000 0000 0000 0110 1111(在前面補了25位0,對數值大小無影響)

   那麼我們把最右端的一個數字放到最左端就是1000  0000 0000 0000 0000 0000 0110 111    結果顯然與第一種不同

思路一代碼:

#include<stdio.h>

int rightrot(unsigned int x , int n)
{
    int k,i;
    int ribits;
    k = x;
    for ( i = 0; k!=0; i++)//算出x二進制形式有多少位
    {
        k=k>>1;
    }
    ribits = (~(~0<<n) & x)<<(i-n);
    x = (x>>n) | ribits;
    return x;
}
int main()
{
    printf("%d",rightrot(111,3));
    return 0;
}
      

  

運作輸出

《C程式設計語言》 練習2-8

  

思路二代碼

#include<stdio.h>

unsigned rightrot(unsigned x, unsigned n)
{
    while (n > 0) {
        if ((x & 1) == 1)
            x = (x >> 1) | ~(~0U >> 1);//U表示無符号,相當于unsigned
        else
            x = (x >> 1);
        n--;
    }
    return x;
}

int main()
{
    printf("%d",rightrot(111,3));
    return 0;
}
      

  

運作結果

《C程式設計語言》 練習2-8