2012-08-27 47 views
1

我想這個代碼分析&,&&和|爲此代碼?

for(i = 32; i > 0; i--) 
{ 
    if(a&1 != 0) //bit mask 
    total += b; 
    a = a >> 1; 
    b = b << 1; 
} 

來說明差異在代碼&是用來「屏蔽」了一下,結果就會完全不同,如果&&已經代替。在這種情況下,表達式1已被解釋爲真值(TRUE),而不是用於保留其中一個位的一位位置。正確?但是,如果我不喜歡這東西反而會發生:

for(i = 32; i > 0; i--) 
{ 
    if(a|1 != 0) //bit mask 
    total += b; 
    a = a >> 1; 
    b = b << 1; 
} 

在第一種情況下,1用於只保留LSB(最低顯著位),即最右邊的位,沒有別的。 |代替什麼?如果我做了這個改變會有什麼不同?

回答

4
a&1 != 0 

應該

(a&1) != 0 

!=&更高的優先級。否則a&1 != 0被讀作a & (1 != 0)

(a|1 != 0)相同。

+1

這是非常有趣的,因爲這些都是從計算機工程中的課程筆記中獲得的,其中的代碼應該是正確的。謝謝你的答案。 –

+0

@NickRosencrantz這是一個非常常見的錯誤。這個優先級是反直覺的,因爲它是D. Ritchie所做的歷史性糟糕的設計選擇。有關詳情,請參閱此處:http://www.lysator.liu.se/c/dmr-on-or.html – ouah

1
(a | 1) != 0 

總是如此。它具有返回a的效果,但是具有最低位集合,顯然不是0(至少不是我見過的任何C實現)。類似地,

(a || 1) 

總是如此,因爲1在C中是真實的並且任何事情或真實是真實的。

1

在這種情況下,您在a&1左右省略括號不會改變程序的含義。

由於!=的優先級,它會評估1 != 0這是1,自!=0是一個完全冗餘的聲明,這不要緊,你是否說if (a OP (1 != 0))if ((a OP 1) != 0)

現在,我們可以看看你的第二個陳述,並按照你的意圖解釋它:(a | 1) != 0。所有位爲零的唯一值是0,它位於比較的右側,但在左側,您始終有一個至少設置了一個位的值(最右邊)。因此這些實際上永遠不會相等,因此(a | 1) != 01相同。

所以,所不同的是(a & 1)實際檢查,如果a是奇數和增量total才把,而(a | 1)增量total在每次迭代中作爲條件是一種贅述。