剑指Offer--二进制中1的个数
問題描述:輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
思路:
解法1:把n與1做與運(yùn)算,判斷n的最低位是不是1;接著把1左移1位,然后跟n做與運(yùn)算,判斷n的次低位是不是1;...;反復(fù)左移,每次都能判斷n的其中一位是不是1.
解法2:如果一個(gè)整數(shù)不為0,則該整數(shù)至少有一位是1。如果把這個(gè)整數(shù)減1,那么整數(shù)最右邊的1會(huì)變成0,如果整數(shù)最右邊1后還有0,那么最右邊的1變成0,其后的0均變成1,該位左邊的數(shù)不變。然后將n-1和n做與運(yùn)算,最右邊的1位處及其后所有位都將變?yōu)?,其前所有位不變。那么一個(gè)數(shù)有多少個(gè)1,就可以進(jìn)行多少次這樣的操作。
例:一個(gè)二進(jìn)制數(shù)1100,從右邊數(shù)起第三位是處于最右邊的一個(gè)1。減去1后,第三位變成0,它后面的兩位0變成了1,而前面的1保持不變,因此得到的結(jié)果是1011.我們發(fā)現(xiàn)減1的結(jié)果是把最右邊的一個(gè)1開始的所有位都取反了。這個(gè)時(shí)候如果我們?cè)侔言瓉淼恼麛?shù)和減去1之后的結(jié)果做與運(yùn)算,從原來整數(shù)最右邊一個(gè)1那一位開始所有位都會(huì)變成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 远程代码
- 下一篇: LSTM 与 Bilstm介绍(包含代码