C语言位操作--不用中间变量交换两数值
生活随笔
收集整理的這篇文章主要介紹了
C语言位操作--不用中间变量交换两数值
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、使用加法與減法交換兩數(shù)值:
#define SWAP(a, b) ((&(a) == &(b)) || \(((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))這種交換數(shù)值a與b的方法沒有使用臨時(shí)變量,初始化檢測a,b,如果在同一內(nèi)存區(qū),則被忽略,當(dāng)然這通常不會(huì)發(fā)生,(編譯器會(huì)忽略,然而無論如何都是一種優(yōu)化),假如可以確
定溢出異常,于是傳遞無符號(hào)數(shù)異常就不會(huì)拋出。
下面的邏輯“或”運(yùn)算的方法在某些機(jī)器上可能要快一些,不要使用浮點(diǎn)型數(shù)字。
2、使用邏輯“或”方法交換兩數(shù)值:
#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))3、使用邏輯“或”方法交換獨(dú)立位:
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為目標(biāo)數(shù)字,以二進(jìn)制的形式表示,從最右邊比特位開始計(jì)算,標(biāo)號(hào)為0,i指向第i+1個(gè)比特位,
n指連續(xù)比特位的個(gè)數(shù),j指向第j+1個(gè)比特位,r保存交換后的值。
e.g.?b =?00101111?? n=3,i=1,j=5
???????r =?11100011
C測試代碼如下:
#include <stdio.h> #include <string.h>void tranlate(int n) //十進(jìn)制轉(zhuǎn)換為二進(jì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){ //設(shè)置為顯示8位的二進(jìn)制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; }?
總結(jié)
以上是生活随笔為你收集整理的C语言位操作--不用中间变量交换两数值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac与centos的ip配置
- 下一篇: 小记:再谈单例模式静态类区别优势