标签:
任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4
1 #include "stdafx.h" 2 3 //可能引起死循环,当n为负数时 4 int NumberOf1_Solution1(int n) 5 { 6 int count = 0 ; 7 while(n) 8 { 9 if(n & 1) 10 count++ ; 11 n = n >> 1; 12 13 // cout+=n&1; 14 // n >>=1; 15 } 16 return count ; 17 } 18 19 //循环次数等于整数二进制的位数 20 int NumberOf1_Solution2(int n) 21 { 22 int count = 0 ; 23 unsigned int flag = 1; 24 while(flag) 25 { 26 if(n & flag) 27 count ++ ; 28 flag = flag << 1; 29 // count +=n&flag?1:0; 30 // flag<<=1; 31 } 32 return count; 33 } 34 35 /*最佳方法 整数有几个1就循环几次 36 把一个整数减去1,再和原来整数做与运算,会把该整数最右边一个1变成0。 37 那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。 38 */ 39 int NumberOf1_Solution3(int n) 40 { 41 int count = 0 ; 42 while(n) 43 { 44 n = (n-1) & n ; 45 count ++ ; 46 } 47 return count ; 48 } 49 50 int main() 51 { 52 int number ; 53 printf("请输入一个整数 (ctrl+z退出) :"); 54 while(scanf("%d",&number) != EOF) 55 { 56 if(number >= 0) 57 printf("Solution1 is: %d\nSolution2 is: %d\nSolution3 is: %d\n", 58 NumberOf1_Solution1(number), NumberOf1_Solution2(number), NumberOf1_Solution3(number)); 59 else //当number<0 时 只用方法2,3计算 60 printf("Solution2 is: %d\nSolution3 is: %d\n",NumberOf1_Solution2(number), NumberOf1_Solution3(number)); 61 62 printf("请输入一个整数 (ctrl+z退出) :"); 63 } 64 return 0 ; 65 }
运算结果如下:
标签:
原文地址:http://www.cnblogs.com/sankexin/p/5615248.html