劍指Offer 面試題10 二進位制中1的個數

2021-07-12 07:54:58 字數 3305 閱讀 6120

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

注意:整數和負數以及0的區別,這是由儲存機制決定的。

分析:將輸入的整數依次右移並與1相位與!

源**如下:

#includeusing std::cout;

using std::endl;

using std::cin;

int numberofone1(long long n)

if (n > 0)

return result;

else

return result + 1;

}int main1()

system("pause");

return 0;

}

執行結果:

請輸入十進位制整數n:63

十進位制整數63中二進位制表示中1的個數為:6

請輸入十進位制整數n:-63

十進位制整數-63中二進位制表示中1的個數為:7

請輸入十進位制整數n:255

十進位制整數255中二進位制表示中1的個數為:8

請輸入十進位制整數n:-255

十進位制整數-255中二進位制表示中1的個數為:9

請輸入十進位制整數n:10

十進位制整數10中二進位制表示中1的個數為:2

請按任意鍵繼續. . .

上述方法直接移動整數,且可以處理輸入負整數的情況,接下來我們移動標誌位保持輸入的整數不變!

源**如下(十六進製制輸入方式):

#includeusing std::cout;

using std::cin;

using std::endl;

int numberofone2(int n)

return result;

}int main()

system("pause");

return 0;

}

執行結果:

請輸入十進位制數n:0x1

十進位制數1的二進位制表示中1的個數為:1

請輸入十進位制數n:0x8000

十進位制數32768的二進位制表示中1的個數為:1

請輸入十進位制數n:0x9

十進位制數9的二進位制表示中1的個數為:2

請輸入十進位制數n:0xff

十進位制數255的二進位制表示中1的個數為:8

請輸入十進位制數n:0x1ff

十進位制數511的二進位制表示中1的個數為:9

請按任意鍵繼續. . .

源**(十進位制):

#includeusing std::cout;

using std::cin;

using std::endl;

/* 負數在記憶體中是以補碼的形式儲存的,所以這種演算法對於直接輸入負整數時,計算是錯誤的!!!

負數的輸入應採取十六進製制的輸入形式

*/int numberofone2(int n)

return result;

}int main()

system("pause");

return 0;

}

執行結果:

請輸入十進位制數n:9

十進位制數9的二進位制表示中1的個數為:2

請輸入十進位制數n:-9

十進位制數-9的二進位制表示中1的個數為:31

請輸入十進位制數n:255

十進位制數255的二進位制表示中1的個數為:8

請輸入十進位制數n:-255

十進位制數-255的二進位制表示中1的個數為:25

請輸入十進位制數n:63

十進位制數63的二進位制表示中1的個數為:6

請按任意鍵繼續. . .

把乙個整數減去1,再和原來的整數做與運算,會把該整數最右邊乙個1變成0,那個乙個整數的二進位制表示中有多少個1,就可以進行多少次這樣的操作。

源**:

#includeusing std::cout;

using std::endl;

using std::cin;

/* 負數在記憶體中是以補碼的形式儲存的,所以這種演算法對於直接輸入負整數時,計算是錯誤的!!!

負數的輸入應採取十六進製制的輸入形式

*/int numberofone3(int n)

return result;

}int main()

system("pause");

return 0;

}

執行結果和方法二相似。

#include#includeint numberof1_solution1(int n)

return count;

}int numberof1_solution2(int n)

return count;

}void test(int number, unsigned int expected)

int main()

執行結果:

solution1: test for 00000000 passed.

solution2: test for 00000000 passed.

solution1: test for 00000001 passed.

solution2: test for 00000001 passed.

solution1: test for 0000000a passed.

solution2: test for 0000000a passed.

新加solution1: test for fffffff7 failed.

solution2: test for fffffff7 failed.

solution1: test for 7fffffff passed.

solution2: test for 7fffffff passed.

solution1: test for ffffffff passed.

solution2: test for ffffffff passed.

solution1: test for 80000000 passed.

solution2: test for 80000000 passed.

請按任意鍵繼續. . .

劍指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...

《劍指offer》(面試題10) 二進位制中1的個數

位運算 位運算是把數字用二進位制表示之後,對每一位上 0 或者 1 的運算。因為位運算總共只有五種運算 與,或,異或,左移和右移 與 0 0 0 1 0 0 0 1 0 1 1 1 或 0 0 0 1 0 1 0 1 1 1 1 1 異或 0 0 0 1 0 1 0 1 1 1 1 0 左移運算子 ...