題目描述:
輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。比如輸入9,9的二進制表示是1001,1的個數是2,是以輸出2。
這有一個重要結論:一個數與該數減一的結果進行與運算,會把該數右邊(低位)第一個1變為0,而該位左邊保持不變(高位)。可以舉一個簡單的例子進行證明:比如1100(對應十進制是12),減去1之後的結果是1011(也就是十進制的11),兩個數進行與運算之後,我們發現最後的結果是1000(對應十進制的8,當然這個8與後面沒有關系,可以略過)。這樣我們每進行一次的與運算就消去一個1,這樣消到最後肯定是0了,是以我們可以在代碼中以這個為循環的終止條件。
基于以上分析,可以寫出如下的代碼(已被牛客ac):