1. 程式人生 > >不用中間變數,交換a、b值

不用中間變數,交換a、b值

 

如果要交換a、b之間的值,一般的做法是:

tmp=a;a=b;b=tmp;這種方法不得不使用一個臨時變數。

從網上學來一個方法,可以不用使用臨時變數:

a^=b^=a^=b;

這樣計算之後,就可以交換a、b值

 

證明:

首先:^ 是 位運算 的一種: 異或 運算

1^1=0;

0^0=0;

1^0=1;

0^1=1;

將a、b用二進位制表示為:

a=An-1 An-2……A1 A0

b=Bn-1 Bn-2……B1 B0

由於a與b進行位運算,是各個bit位分別進行運算,互不影響,下面對某一個位值i上的運算進行分析;

設Ai和Bi是a、b二進位制位上的數值,0或1。

四種情況:

當Ai=1;Bi=1;時:

Ai^=Bi;後:Ai=0;

Bi^=Ai;後:Bi=1;

Ai^=Bi;後:Ai=1;

當Ai=1;Bi=0;時:

Ai^=Bi;後:Ai=1;

Bi^=Ai;後:Bi=1;

Ai^=Bi;後:Ai=0;

當Ai=0;Bi=1;時:

Ai^=Bi;後:Ai=1;

Bi^=Ai;後:Bi=0;

Ai^=Bi;後:Ai=1;

當Ai=0;Bi=0;時:

Ai^=Bi;後:Ai=0;

Bi^=Ai;後:Bi=0;

Ai^=Bi;後:Ai=0;

也就是說,對於a、b的每個bit位上的值,進行三次異或賦值運算之後,都會被交換,那麼a、b值也就交換了。

傳統的tmp=a;a=b;b=tmp;方法也是進行三次賦值運算,但是異或(^)作為位運算,效率更高,而且避免了中間變數的使用。

但是位運算只能在整型數值之間進行,這是此方法的侷限性。

複製程式碼
 1 namespace ConsoleApplication1
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7            int a = 10;
 8            int b = 20;
 9            a ^= b;
10            b ^= a;
11            a ^= b;
12            Console.WriteLine("a={0}", a);
13            Console.WriteLine("b={0}", b);
14            Console.ReadKey();
15         }
16     }
17 }
18 19 /*Out: 20 a = 20 21 b = 10
*/
複製程式碼

對於int型變數最簡單的方式是:
int a,b;
a = b – a + (b = a) ;

如果要交換a、b之間的值,一般的做法是:

tmp=a;a=b;b=tmp;這種方法不得不使用一個臨時變數。

從網上學來一個方法,可以不用使用臨時變數:

a^=b^=a^=b;

這樣計算之後,就可以交換a、b值

 

證明:

首先:^ 是 位運算 的一種: 異或 運算

1^1=0;

0^0=0;

1^0=1;

0^1=1;

將a、b用二進位制表示為:

a=An-1 An-2……A1 A0

b=Bn-1 Bn-2……B1 B0

由於a與b進行位運算,是各個bit位分別進行運算,互不影響,下面對某一個位值i上的運算進行分析;

設Ai和Bi是a、b二進位制位上的數值,0或1。

四種情況:

當Ai=1;Bi=1;時:

Ai^=Bi;後:Ai=0;

Bi^=Ai;後:Bi=1;

Ai^=Bi;後:Ai=1;

當Ai=1;Bi=0;時:

Ai^=Bi;後:Ai=1;

Bi^=Ai;後:Bi=1;

Ai^=Bi;後:Ai=0;

當Ai=0;Bi=1;時:

Ai^=Bi;後:Ai=1;

Bi^=Ai;後:Bi=0;

Ai^=Bi;後:Ai=1;

當Ai=0;Bi=0;時:

Ai^=Bi;後:Ai=0;

Bi^=Ai;後:Bi=0;

Ai^=Bi;後:Ai=0;

也就是說,對於a、b的每個bit位上的值,進行三次異或賦值運算之後,都會被交換,那麼a、b值也就交換了。

傳統的tmp=a;a=b;b=tmp;方法也是進行三次賦值運算,但是異或(^)作為位運算,效率更高,而且避免了中間變數的使用。

但是位運算只能在整型數值之間進行,這是此方法的侷限性。

複製程式碼
 1 namespace ConsoleApplication1
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7            int a = 10;
 8            int b = 20;
 9            a ^= b;
10            b ^= a;
11            a ^= b;
12            Console.WriteLine("a={0}", a);
13            Console.WriteLine("b={0}", b);
14            Console.ReadKey();
15         }
16     }
17 }
18 19 /*Out: 20 a = 20 21 b = 10
*/
複製程式碼

對於int型變數最簡單的方式是:
int a,b;
a = b – a + (b = a) ;