C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)
生活随笔
收集整理的這篇文章主要介紹了
C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
實現一個函數,輸入一個整數,輸出該數二進制中1的個數。例如把9表示成二進制是1001,有2位是1,因此如果輸入是9,該函數輸出2
第一種解法(死循環)
代碼如下:
int NumberOf1(int n) { int count = 0; while(n){ if(n & 1) count++; n = n >> 1; } return count;}這樣很容易造成死循環,如果輸入是一個負數,將負數想右移一位的時候,并不是簡單的將最高位1移到第二位,而是移位后最高位任然回事1,因為右移前是一個負數,右移后仍要保持是負數,一直持續下去數字就會變成0xFFFFFFFF而陷入死循環
第二種解法(常規)
為了避免死循環,可以不移動輸入的數字,移動一個無符號的變量1
代碼如下:
int NumberOf1(int n){int count = 0;unsigned int tmp = 1;while (tmp){if (n & tmp){count++;}tmp = tmp << 1;}return count;}這樣效率相對低一些,因為這個循環次數等于整數二進制的位數,32位的整數就需要循環32次,浪費不必要的時間
第三種解法(將以上優缺點進行了融合)
為了提高代碼的效率,可以將整數減1在與之前的原整數進行位與運算
代碼如下:
int NumberOf2(int n){ int count = 0;while (n){n = n&(n - 1);count++;}return count;}這種解法可以有效的避免死循環和效率低,例如1101,具體實現過程如下
注:1、不能用除法來代替移位,因為除法的效率比移位運算要低得多,應該多用移位來代替除法
總結
以上是生活随笔為你收集整理的C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《深度探索C++对象模型(Inside
- 下一篇: C++ 基本数据类型 的 字节数