**來自:
。題目:輸入乙個整數,判斷該正數的二進位制表示中有多少個1?例如:輸入整數12,轉換成二進位制是1100,共有2個1,因而應該輸出2.
分析1:我們可以這樣考慮,從右向左注意判斷每乙個位上是否為1,怎麼判斷?我們讓這個數和整數1(01)做與運算,由於1除最後一位外其餘部分全部都是0,因而如果整數的最後一位是1,則返回結果為1,如果整數的最後1為是0,則返回結果為0;接著,我們讓該整數與2(10)做與運算,我們就可以判斷整數的倒數第二位是否是1;再下來,我們讓該整數與4(100)做與運算,判斷倒數第三位是否為1;以此類推,我們就可以判斷出整數的所有1的個數,而與整數做與運算的數分別為1,2,4,8......我們可以讓1做左移1位的運算得到。基於這種思路我們可以得到如下的**:
1 #include執行結果如下:2 #include
3using
namespace std;45
int numbersof1s(int number)
6 16
return cnt;
17 }
1819
int main()
20
分析2:如果乙個整數不為0,那麼它的二進位制形式至少有一位是1,如果我們將乙個二進位制數減去1,那麼這個二進位制數的最右邊的1將會變成0,而這個1後面的0都會變成1.以1100為例,最右邊的1是右數第三位,這個數減去1之後變成1011。如果我們把得到的這個數和原數進行與運算,那麼右邊第乙個1及之後的數都為0,即1100&1011==1000,也就是說,我們把乙個數減去1後與原數做與運算將會消去最右邊的乙個1,有多少個1,我們就做多少次類似的迴圈即可。基於這有思路我們有如下的**:
1 #include執行結果如下:2 #include
3using
namespace std;45
int numbersof1s(int number)
6 13
14return cnt;
15 }
1617
int main()
18
關於移位運算和乘除運算:在分析1中,我們說可以對乙個1不斷一位運算得到十進位制中的1,2,4,8,16等等,有同學可能會說,我們為什麼不對flag做×2的運算呢?因為移位運算的效率要遠高於乘除運算,不光是本題,在其他的程式設計中,我們也應該盡量用移位運算代替乘除運算。
乙個十進位制整數轉換成二進位制含多少個1
1。最簡單的方法 使用bitset cpp view plain copy unsigned count unsigned u 2。使用移位迴圈測試 cpp view plain copy unsigned count unsigned u return ret 3。使用分治法 若f n b n 表...
整數的二進位制表達中有多少個1
給定乙個32位的整數n,可為0,可為正,也可為負,返回該整數二進位制表達中1的個數。最簡單的做法就是求出乙個整數如何得到它的二進位制數。以整數5為例。用5除以2,取餘的結果為1時代表二進位制表達中含有乙個1,此時的被除數變為5 2。迴圈直到被除數為0,迴圈結束。注意 負數的二進位制表示的首位為1.在...
整數的二進位制表示式中有多少個1
給定乙個32位整數n,可為0,可為正,也可為負,返回該整數二進位制表達中1的個數 整數n每次進行無符號右移一位,檢查最右邊的bit是否為1來進行統計,如下 public int count1 int n return res 上面這個方法在最複雜的情況下要經過32次迴圈 public int cou...