日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言位操作--不用中间变量交换两数值

發(fā)布時(shí)間:2025/3/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。