C語言位操作--不用中間變量交換兩數值


1、使用加法與減法交換兩數值:

 #define SWAP(a, b) ((&(a) == &(b)) || \
                (((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))

這種交換數值a與b的方法沒有使用臨時變量,初始化檢測a,b,如果在同一內存區,則被忽略,當然這通常不會發生,(編譯器會忽略,然而無論如何都是一種優化),假如可以確

定溢出異常,於是傳遞無符號數異常就不會拋出。

下面的邏輯“或”運算的方法在某些機器上可能要快一些,不要使用浮點型數字。

2、使用邏輯“或”方法交換兩數值:

 #define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))

3、使用邏輯“或”方法交換獨立位:

1 unsigned int i, j; 
2 unsigned int n;    
3 unsigned int b;    
4 unsigned int r;   
5 
6 unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); // XOR temporary
7 r = b ^ ((x << i) | (x << j));

其中:b為目標數字,以二進制的形式表示,從最右邊比特位開始計算,標號為0,i指向第i+1個比特位,

n指連續比特位的個數,j指向第j+1個比特位,r保存交換后的值。

e.g. b = 00101111   n=3,i=1,j=5

       r = 11100011

C測試代碼如下:

#include <stdio.h>
#include <string.h>

void tranlate(int n)  //十進制轉換為二進制
{
    int a[1000];
    int i,L,j;
    i=L=0;
    while(n/2){
        a[i]=n%2;
        n/=2;
        L++,i++;
    }
    a[i]=1;
    while(L<8){    //設置為顯示8位的二進制
        a[++i]=0;
        L++;
    }
    for(j=L-1; j>=0; j--){
        printf("%d",a[j]);
    }
    printf("\n");
}


int main(int argc, char *argv[])
{
    unsigned int i, j; 
    unsigned int n;    
    unsigned int b;   
    unsigned int r;    
    b=47,n=3,i=1,j=5;
    tranlate(b);
    unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); 
    r = b ^ ((x << i) | (x << j));
    tranlate(r);
    getchar();
    getchar();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM