面試程式設計題 二進位制中1的個數

2021-10-24 18:03:30 字數 2213 閱讀 7799

題目:二進位制中1的個數

解法一:(短除法——可能引起死迴圈)

解法二:(使用二進位制和位運算——可能引起死迴圈)

解法三:(常規解法)

解法四:(驚喜解法)

相關題型

題目:實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數。例如:若輸入9,該數的二進位制為1001,所以輸出2.

#include using namespace std;

/*二進位制表示1的個數統計*/

int number_ofone(int n)

n /= 2;

} return count;

}/*10進製轉二進位制*/

上述的解法一和解法二類似,相比而言,位運算的效率要比四則運算的要高很多。但是這兩種思路都缺陷,它們沒有考慮到負整數的情況,例如:當輸入數字為0x8000 0000時,當把負數0x8000 0000右移一位,並不是把最高位的1移到第二位變成0x4000 0000,而是0xc000 0000。因為移位前是乙個負數,要保證移位後仍是乙個負數,因此一位後的最高位會設為1。如果一直做右移操作,最終數字會變為0xffff ffff而陷入死迴圈。

#include using namespace std;

int number_ofone_3(int n)

flag <<= 1;

} return count;

}int main()

return count;

}int main()

執行結果:

1.用一條語句判斷乙個整數是不是2的整數次方。

答案:if(n&(n-1)==0)

解析:根據上述解法四提供給我們的思路,舉一反三,乙個整數如果是2的整數次方,那麼它的二進位制有且只有一位是1,那麼整數n&(n-1)就將整數的唯一乙個1變為了0,所以得到上述答案。

2.輸入兩個整數m和n,計算需要改變m的二進位制幾位才能得到n。比如10的二進位制為1010,13的二進位制1101,需要改變三位才能將10變成13.

思路:先進行異或運算(異或運算相同取0不同取1的法則)得出結果,只要再統計結果中1的個數就能知道兩個數的不同位數。

**實現:

#include using namespace std;

int chang_num(int m, int n)

return count;

}int main()

執行結果:

二進位制 二進位制中1的個數

題目 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。示例 1 輸入 00000000000000000000000000001011 輸出 3 解釋 輸入的二進位制串 0000000...

程式設計題 統計二進位制中1的個數

問題 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解題思路 因為負數用補碼表示,對於負數右移時,在最高位補得是1,因此負數移位位產生無限個1,陷入死迴圈。出現死迴圈的錯誤答案 int numberof1 cannotuse int n 把n的2進製形式往右推一位 n n 1 負...

二進位制中1的個數 二進位制中0的個數

1 題目 實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數,例如把9表示成二進位制是1001,有2位是1。因此如果輸入9,該函式輸出2。2 解法 解法 一 可能會引起死迴圈的解法 基本思路 先判斷整數二進位制表示中最右邊一位是不是1。接著把輸入的整數右移一位,此時原理處於從右邊數起的第二位...