剑指Offer--二进制中1的个数
問題描述:輸入一個整數(shù),輸出該數(shù)二進制表示中1的個數(shù)。其中負數(shù)用補碼表示。
思路:
解法1:把n與1做與運算,判斷n的最低位是不是1;接著把1左移1位,然后跟n做與運算,判斷n的次低位是不是1;...;反復左移,每次都能判斷n的其中一位是不是1.
解法2:如果一個整數(shù)不為0,則該整數(shù)至少有一位是1。如果把這個整數(shù)減1,那么整數(shù)最右邊的1會變成0,如果整數(shù)最右邊1后還有0,那么最右邊的1變成0,其后的0均變成1,該位左邊的數(shù)不變。然后將n-1和n做與運算,最右邊的1位處及其后所有位都將變?yōu)?,其前所有位不變。那么一個數(shù)有多少個1,就可以進行多少次這樣的操作。
例:一個二進制數(shù)1100,從右邊數(shù)起第三位是處于最右邊的一個1。減去1后,第三位變成0,它后面的兩位0變成了1,而前面的1保持不變,因此得到的結(jié)果是1011.我們發(fā)現(xiàn)減1的結(jié)果是把最右邊的一個1開始的所有位都取反了。這個時候如果我們再把原來的整數(shù)和減去1之后的結(jié)果做與運算,從原來整數(shù)最右邊一個1那一位開始所有位都會變成0。如1100&1011=1000.
代碼:
public class Solution{//算法1public int NumberOf1(int n){int count = 0;int flag = 1;while(n!=0){if((n&flag)!=0)count++;flag=flag<<1;}return count;} //算法2public int NumberOf2(int n){int count = 0;while(n!=0){count++;n=(n-1)&n;}return count;} }?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaoxli/p/9455538.html
總結(jié)
以上是生活随笔為你收集整理的剑指Offer--二进制中1的个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache ActiveMQ 远程代码
- 下一篇: 学习书籍