1. 程式人生 > >C語言正數和負數迴圈右移,左移,把某正數的第m位(從0開始)到n位取反

C語言正數和負數迴圈右移,左移,把某正數的第m位(從0開始)到n位取反

問題:從鍵盤輸入一個整型數(int型),然後再輸入一個正整數m,把第一個數迴圈右移m位後輸出;

int型別佔用32位。第一位為符號位,1則為負數,0為正數。

>>往右移動,右邊的丟棄,如果是正數,則左邊補0,如果是負數則補1.

<<往左移動,每次移動補0

迴圈右移指的是移動到右邊的不丟棄,而是在第一位出現。迴圈

負數的迴圈右移思想是往左移動32-x位。(x表示要右移的位數),因為要往左移,所以補0.又負數其他位都為1,故生成32-x個1與左移自動補的0進行|運算,目的是讓補的位置為1,相關程式碼如下:

int number,index; //number:要進行右移的數字,index表示移動的位數
    scanf("%d%d",&number,&index);
    if(number >= 0){
            printf("%d",((number&((0<<9)+(int)pow(2, index)-1))<<index)+(number>>index));
    }
    else{
        printf("%d",(number << (32-index))|((int)pow(2, 32-index)-1));
    }

============================================================================
今天發現了更簡單的方法
printf("right move: %d\n",number>>index|(number<<(32-index)));
printf("left move: %d",number << index | (number << (32 - index)));
把x的第m位(從0開始)到第n位取反
(~(x >> m)&((int)pow(2,(n-m+1))-1))<<m|(x & ((int)pow(2,(n-m+1))-1)));