/**************问题描述************ 求二进制数中1的个数 **********************************/ #include<iostream> using namespace std; /****************解法一:直接除2******************* 对num除以2,余数为1则result加1,时间复杂度为O(logv) v为num的二进制位数 **************************************************/ int Count1(int num){ int result=0; while(num){ if(num %2 ==1){ result++; } num /=2; } return result; } /******************解法二:使用位操作************* 对num使用位运算,将num与0x01做位与,为1则result加1 时间复杂度为O(logv),v为num的二进制位数 *************************************************/ int Count2(int num){ int result=0; while(num){ result += num&1 ; num >>= 1; } return result; } /***************解法三:光考虑1的个数************ 例如对num=15=1111, num=num&(num-1)=1111&1110=1110,result=1; num=num&(num-1)=1110&1101=1100,result=2; num=num&(num-1)=1100&1011=1000,result=3; num=num&(num-1)=1000&0111=0000,result=4; 时间复杂度O(M),M为num的位数 *************************************************/ int Count3(int num){ int result=0; while(num){ num &= (num-1); result ++; } return result; } /***************解法四:时空折中***************** 假设知道输入的num为几位数的话,可以预先存好每个数 有多少个1,然后到时候直接查询即可。这样需要多申请 2^n那么大的数组来保存,但是时间复杂度为O(1) *************************************************/ #define MAIN #ifdef MAIN int main(){ int num=16; int result=Count1(num); cout<<"Result1: "<<result<<endl; cout<<"Result2: "<<Count2(num)<<endl; cout<<"Result3: "<<Count3(num)<<endl; system("PAUSE"); return 0; } #endif