2011-03-04 38 views
3

請幫助解決這個問題並解釋邏輯。 我不知道&運營商如何在這裏工作。什麼是按位AND運算符&做什麼?

void main() { 
    int a = -1; 
    static int count; 
    while (a) { 
     count++; 
     a &= a - 1; 
    } 
    printf("%d", count); 
} 
+3

count應該按照 – Andrew 2011-03-04 10:03:47

+1

的方式初始化問題是什麼?你期望的答案是什麼? – MAK 2011-03-04 10:05:53

+1

看起來很像:http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer/109036#109036 – sarnold 2011-03-04 10:06:50

回答

5

如果你指的是

a&=a-1; 

那麼它複製到一個事後的按位與運算和A-1。

編輯: 作爲從塔德烏什·A.Kadłubowski在評論複製:

a = a & (a-1); 
+2

它幾乎與a = a&(a-1)相同;' – 2011-03-04 10:06:47

+0

@Tadeusz複製並歸因於您的評論,並提出您的評論,thnx – 2011-03-04 11:06:37

+0

它可能是重要的是要注意,對於'a'的某些值,這個表達式可能不等同。考慮'#define a(++ b)'爲其他變量'b'。爲了防止OP是CS學生學習C的複雜性,稍作澄清。 – 2011-03-04 11:43:51

2

&bitwise and operator

操作

a&=a-1; 

其是相同:

a = a & a-1; 

清除的a的至少顯著位。

所以你的程序有效地計算了在a中設置的位數。

而且由於count被宣佈爲static它會自動初始化爲0

0

你計數未初始化

應該

static int count=0; 

操作&被調用,http://en.wikipedia.org/wiki/Bitwise_operation#AND

+0

這是不正確的。 – codaddict 2011-03-04 10:08:08

+0

C標準保證如果程序員沒有明確地初始化它們,靜態變量就被初始化爲零。無論如何,良好的做法是程序要麼明確地初始化它們,要麼在使用它們之前給它們賦值。 – Lundin 2011-03-04 10:20:52

+0

我試圖在上面反駁你,並在看過C規範後意識到我的錯誤。如果有其他人正在看,相關部分是6.7.8.10。 – 2011-03-04 10:52:34

3

的的a表達a&=a-1;清除至少顯著位(最右1)。該代碼計算a(在這種情況下爲-1)中的位數。

a = -1 ; // 11111111 11111111 11111111 11111111 32bits signed integer 

代碼輸出32上的32位整數配置開始。