《剑指offer》第十五题(二进制中1的个数)
生活随笔
收集整理的這篇文章主要介紹了
《剑指offer》第十五题(二进制中1的个数)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// 面試題:二進制中1的個數 // 題目:請實現一個函數,輸入一個整數,輸出該數二進制表示中1的個數。例如 // 把9表示成二進制是1001,有2位是1。因此如果輸入9,該函數輸出2。 #include <iostream> using namespace std;//將flag(1)不停左移(右移會出現死循環情況),對每位進行與運算 int NumberOf1_Solution1(int n) {int count = 0;unsigned int flag = 1;while (flag)//循環次數數據類型的位數 {if (n & flag)//如果該位為1,則表達式成立,count加1count++;flag = flag << 1;//對flag左移1位 }return count; }//更為優秀的算法,循環次數僅為1的個數 //具體思想是,一個整數減去1和這個整數進行與運算,相當于把該整數最右邊的1變為0,具體可以手動推導 int NumberOf1_Solution2(int n) {int count = 0;while (n)//如果這個整數還不為0 {++count;n = (n - 1) & n;}return count; }// ====================測試代碼==================== void Test(int number, unsigned int expected) {int actual = NumberOf1_Solution1(number);if (actual == expected)cout << "Solution1: Test for " << number << " passed.\n";elsecout << "Solution1: Test for " << number << " failed.\n";actual = NumberOf1_Solution2(number);if (actual == expected)cout << "Solution2: Test for " << number << " passed.\n";elsecout << "Solution2: Test for " << number << " failed.\n";printf("\n"); }int main(int argc, char* argv[]) {// 輸入0,期待的輸出是0Test(0, 0);// 輸入1,期待的輸出是1Test(1, 1);// 輸入10,期待的輸出是2Test(10, 2);// 輸入0x7FFFFFFF,期待的輸出是31Test(0x7FFFFFFF, 31);// 輸入0xFFFFFFFF(負數),期待的輸出是32Test(0xFFFFFFFF, 32);// 輸入0x80000000(負數),期待的輸出是1Test(0x80000000, 1);system("pause"); }
?
?
轉載于:https://www.cnblogs.com/CJT-blog/p/10478249.html
總結
以上是生活随笔為你收集整理的《剑指offer》第十五题(二进制中1的个数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web渗透测试基本步骤
- 下一篇: 使用nexus来搭建Nuget私服