題目:輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。
這一題與 牛客網_華為機試_015_求int型正整數在記憶體中儲存時1的個數 (十進位制轉二進位制)基本一致,解法請參考。
主要注意的點在於千萬不要用模2取餘法來統計2的個數,不然面試會死的很慘。首先除法的效率比移位運算要低得多,在實際程式設計中應盡可能地用移位運算子代替乘除法。下面主要寫一下劍指offer的拓展題
1.用一條語句判斷乙個整數是不是2的整數次方。
首先這個數必定是正整數,因為是2的整數次方,負數返回false。再者,乙個數是2的整數次方,那麼他一定只有一位是1,其餘全為0,類似於十進位制中10的整數次方:10 100 1000 10000 100000,在二進位制中是2的整數次方就應該是這種形式。
那麼利用原題最優解法中 (n-1) & n 可以把最右邊的1去掉的特性,做一次 (n-1)&n,如果為0則證明只有乙個1,則證明是2的整數次方。
即 if( ((n-1)&n) == 0)各位鄉親父老請注意,&優先順序低於== ,可是千萬要加括號啊,&略高於邏輯計算,算是乙個級別吧就這麼記憶
2.輸入m和n兩個整數,計算需要改變m的二進位制表示中的多少位,才能得到n。如1010到1101需要改變三位。
首先不要方,本質上是判斷兩個二進位制有多少位不同,想一想位運算中那個運算與相同、不同有關,仔細一想是異或,異或相同為0,不同為1。我們把m和n異或以後,只需要統計1的個數即為不同的位數,也就是需要改變的位數,問題又回到了統計二進位制1的問題。
**:
#include #include #include using namespace std;
//基本解法,eg分別用0001、0010、0100、1000位與,非零則說明有1
int numof1(int num)
return count;
}//優秀解法 num = (num - 1) & n 將右邊的1全置為0
int numof1ex(int num)
return count;
}//手動%2法
int numof1manual(int num)
return count;
}//是不是2的整數次方
bool is2pow(int n)
//我們之間的二進位制差多少位
int changenum(int m, int n)
int main()
劍指Offer 面試題10 二進位制中1的個數
請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1.因此如果輸入9,該函式輸出2.注意 整數和負數以及0的區別,這是由儲存機制決定的。分析 將輸入的整數依次右移並與1相位與!源 如下 includeusing std cout using st...
劍指offer面試題10 二進位制中1的個數
題目 請實現乙個函式,輸入乙個整數,輸出該二進位制表示中1的個數。例如把9表示成二進位制是1001,有2位是1,因此如果輸入9,該函式輸出2。常規的解題思路 可以把n和1做與運算,如果結果為1,那麼n的最後一位為1,否則為0,然後n右移1位,再和1做與運算,直到判斷完n的所有位。int statis...
劍指offer 面試題10 二進位制中 1 的個數
題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如把 9 表示成二進位制是 1001 有 2 位是 1,因此如果輸入 9,函式輸出 2.這個題本來我的思路是模擬十進位制的規則,設定乙個計數變數count,初始值為0。然後用給的整數數和2進行取餘操作,結果只有兩種可能 0或1...