程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 使用異或運算交換兩個任意類型變量,運算交換類型變量

使用異或運算交換兩個任意類型變量,運算交換類型變量

編輯:關於C語言

使用異或運算交換兩個任意類型變量,運算交換類型變量


這篇文章中將使用C語言,實現交換兩個任意類型變量的功能.說到任意類型用C讓人感覺很難做,如果是C++則使用模板函數就輕松搞定:

template<class T> 
inline void      swap(T& t1, T& t2) 
{ 
    T tmp; 
    tmp = t1; 
    t1 = t2; 
    t2 = tmp; 
}

先說下使用^來交換兩個整數,其代碼看著簡單但不容易理解

a ^= b;
b ^= a;
a ^= b;

有人說這種寫法很奇葩,但我要說的是,異或運算是計算機很常用的操作.搞懂這一算法是熟練掌握異或的基礎.關於^交換兩整數的理解方式可以按如下方式:

先將a,b當成兩個布爾類型,那麼a,b會有四種組合

0,0  (1)a ^= b;變成 0,0 (2)b ^= a;變成 0,0 (3)a ^= b;變成 0,0

1,0  (1)a ^= b;變成 1,0 (2)b ^= a;變成 1,1 (3)a ^= b;變成 0,1

0,1  (1)a ^= b;變成 1,1 (2)b ^= a;變成 1,0 (3)a ^= b;變成 1,0

1,1  (1)a ^= b;變成 0,1 (2)b ^= a;變成 0,1 (3)a ^= b;變成 1,1

這樣三句代碼執行完成後,四種組合中的數值都得到了交換.

即然位運算與BIT相鄰數值無關的,那麼8個BIT的char類型,16個BIT的short,以及long, long long都可以使用^來交換.

還有人認為這種異或運算只能用於整數類型的交換.實際上異或運算是針對二進制的,既然計算機所有的數據類型都是以二進制進行保存的,那麼當然可以用異或運算交換任何數據類型.

最後我的解決方案如下:

 1 #define XYZ_SWAP(i, j) \
if (&i != &j)\ 2 {\ 3 switch(sizeof(i))\ 4 {\ 5 case 1:\ 6 *(char*)&i ^= *(char*)&j;\ 7 *(char*)&j ^= *(char*)&i;\ 8 *(char*)&i ^= *(char*)&j;\ 9 break;\ 10 case 2:\ 11 *(short*)&i ^= *(short*)&j;\ 12 *(short*)&j ^= *(short*)&i;\ 13 *(short*)&i ^= *(short*)&j;\ 14 break;\ 15 case 4:\ 16 *(long*)&i ^= *(long*)&j;\ 17 *(long*)&j ^= *(long*)&i;\ 18 *(long*)&i ^= *(long*)&j;\ 19 break;\ 20 case 8:\ 21 *(long long*)&i ^= *(long long*)&j;\ 22 *(long long*)&j ^= *(long long*)&i;\ 23 *(long long*)&i ^= *(long long*)&j;\ 24 break;\ 25 default:\ 26 for (int k = 0; k < sizeof(i); k++)\ 27 {\ 28 *((char*)&i + k) ^= *((char*)&j + k);\ 29 *((char*)&j + k) ^= *((char*)&i + k);\ 30 *((char*)&i + k) ^= *((char*)&j + k);\ 31 }\ 32 break;\ 33 }\ 34 } 35 36 void main() 37 { 38 char ca = 10; 39 char cb = 20; 40 XYZ_SWAP(ca, cb); 41 42 short sa = 10; 43 short sb = 20; 44 XYZ_SWAP(sa, sb); 45 46 int ia = 10; 47 int ib = 20; 48 XYZ_SWAP(ia, ib); 49 50 long long lla = 10; 51 long long llb = 20; 52 XYZ_SWAP(lla, llb); 53 54 float fa = 10.01f; 55 float fb = 2000.89f; 56 XYZ_SWAP(fa, fb); 57 58 double da = 10.01; 59 double db = 2000.89; 60 XYZ_SWAP(da, db); 61 62 void* pa = &da; 63 void* pb = &db; 64 XYZ_SWAP(pa, pb); 65 }

這裡使用了個宏定義來實現不同類型的兩個變量的交換.還有就是假設long占用4個字節.

 


怎用位異或運算(^)交換兩個數的值!

int a = *;
int b = *;
a = a ^ b;
b = b ^ a;
a = a ^ b;
就能實現ab的交換了
 

怎不用變量交換兩個數的數值?指導,用c語言實現

舉例:
#include<stdio.h>
{
int a=2,b=3;
a=a+b;
b=a-b;
a=a-b;
printf("a=%d,b=%d\n",a,b);
}
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved