2012-07-18 49 views
1

這裏是一個程序,交換兩個號碼使用臨時變量,並在使用移位操作:ç交換實現在移位

#include <stdio.h> 
#include <conio.h> 
int main(void) 
{ 
    int a,b,i,j; 
    clrscr(); 
    printf(「Enter two integers: 「); 
    scanf(「%d%d」,&a,&b); 
    printf(「a=%d,b=%d\n」,a,b); 
    for(i = 0; i < 16; i++) 
    { 
     if((a & (1 << i))^(b & (1 << i))) 
     { 
      a = a^(1 << i); 
      b = b^(1 << i); 
     }  
    } 
    printf(「a=%d,b=%d」,a,b); 
    getch(); 
    return 0; 
} 

我的問題是什麼是1的意義在這個計劃? 我知道異或那的工作原理如下

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

的方法,但我不知道如何通過上述程序的作品?

+2

請不要實際交換類似的東西(甚至是3行xor版本)。無論如何,1 << x與'1'是一樣的,後面是二進制的'x'' 0,所以它只是利用它(我相信它每次交換一次)。 – Corbin 2012-07-18 09:27:24

+2

這真的是效率低下,是我見過的最糟糕的「swap」實現,此外,如果「int」只發生16位寬,它就會發生整數溢出。你從哪裏得到這個殘餘物? – 2012-07-18 09:49:35

+0

對於像上面的'xor'這樣的每個速記/智能alec編程技巧,一隻小貓會被殺死!而一個必須閱讀的程序員將追逐並追捕責任人! – t0mm13b 2012-07-18 20:15:15

回答

1

1在最右邊的位置集上有一位。 1<<i有一個位i集。這個程序遍歷每一位,如果它們不同,就交換它們。

  • a&(1<<i)測試,如果a有位i集。
  • ((a&(1<<i))^(b&(1<<i)))測試如果位iab是不同的。
  • a=a^(1<<i)切換位i
0

它與異或技巧相似,但每次只交換一位,並且只有在ab之間實際上有所不同。

1<<i具有位i設置爲1,其他位爲0。

另外,這並不交換兩個數字,而無需使用一個臨時變量。它使用臨時文件i

2

如果只設置了一位,則切換每一位。

C = A &(1 < < i)如的第i個比特被設置=真

d = B &(1 < < i)如b的第i位被設置=真

| c | d | Action   | c' | d' | 
------------------------------------- 
| 0 | 0 | Do nothing  | 0 | 0 | 
| 0 | 1 | Toggle the bits | 1 | 0 | 
| 1 | 0 | Toggle the bits | 0 | 1 | 
| 1 | 1 | Do nothing  | 1 | 1 |