C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)
題目:
實(shí)現(xiàn)一個(gè)函數(shù),輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制中1的個(gè)數(shù)。例如把9表示成二進(jìn)制是1001,有2位是1,因此如果輸入是9,該函數(shù)輸出2
第一種解法(死循環(huán))
代碼如下:
int NumberOf1(int n) { int count = 0; while(n){ if(n & 1) count++; n = n >> 1; } return count;}這樣很容易造成死循環(huán),如果輸入是一個(gè)負(fù)數(shù),將負(fù)數(shù)想右移一位的時(shí)候,并不是簡(jiǎn)單的將最高位1移到第二位,而是移位后最高位任然回事1,因?yàn)橛乙魄笆且粋€(gè)負(fù)數(shù),右移后仍要保持是負(fù)數(shù),一直持續(xù)下去數(shù)字就會(huì)變成0xFFFFFFFF而陷入死循環(huán)
第二種解法(常規(guī))
為了避免死循環(huán),可以不移動(dòng)輸入的數(shù)字,移動(dòng)一個(gè)無(wú)符號(hào)的變量1
代碼如下:
int NumberOf1(int n){int count = 0;unsigned int tmp = 1;while (tmp){if (n & tmp){count++;}tmp = tmp << 1;}return count;}這樣效率相對(duì)低一些,因?yàn)檫@個(gè)循環(huán)次數(shù)等于整數(shù)二進(jìn)制的位數(shù),32位的整數(shù)就需要循環(huán)32次,浪費(fèi)不必要的時(shí)間
第三種解法(將以上優(yōu)缺點(diǎn)進(jìn)行了融合)
為了提高代碼的效率,可以將整數(shù)減1在與之前的原整數(shù)進(jìn)行位與運(yùn)算
代碼如下:
int NumberOf2(int n){ int count = 0;while (n){n = n&(n - 1);count++;}return count;}這種解法可以有效的避免死循環(huán)和效率低,例如1101,具體實(shí)現(xiàn)過(guò)程如下
注:1、不能用除法來(lái)代替移位,因?yàn)槌ǖ男时纫莆贿\(yùn)算要低得多,應(yīng)該多用移位來(lái)代替除法
總結(jié)
以上是生活随笔為你收集整理的C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《深度探索C++对象模型(Inside
- 下一篇: C++ 基本数据类型 的 字节数