初级-有多少个1
题目描述: 请实现一个函数,输入一个整数,输出该整数使用二进制表示时1的个数,例如把9表示成二进制是1001,有2位是1,因此得出结果为2。
输入:首先输入样例个数,然后输入需要判断的整数。
输出:输出该整数中1的个数。
样例输入:
2
9
99
样例输出:
2
4
下面给出3种题解,这里主要分析规律:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
1 #include<stdio.h> 2 3 //1、普通级别,即每次把n右移一位,与1相与,判断结果。 4 //分析:当n<0时,这种情况有可能出现死循环。 5 int Numberof1_0(int n){ 6 7 int count = 0; 8 9 while(n){ 10 if(n&1) 11 count++; 12 n>>1; 13 } 14 return count; 15 } 16 17 //2、普通级别优化,声明一个变量,每次左移变量与n相与,判断结果。 18 int Numberof1_1(int n){ 19 20 int count = 0; 21 int flag = 1; 22 23 while(flag){ 24 if(n&flag) 25 count++; 26 flag<<1; 27 } 28 return count; 29 } 30 31 //3、找规律,写代码。 32 int Numberof1_2(int n){ 33 34 int count = 0; 35 36 while(n){ 37 count++; 38 n = (n-1)&n; 39 } 40 return count; 41 } 42 43 int main(){ 44 int n,k; 45 46 scanf("%d",&k); 47 48 while(k--){ 49 scanf("%d",&n); 50 51 printf("%d\n",Numberof1_2(n)); 52 } 53 54 return 0; 55 }
接下来,我们再思考一个问题:判断一个正整数是否为2的乘方,比如8 = 2x2x2,那么8就是2的乘方。
分析:一个正整数要为2的乘方,那么其二进制一定只有最高位为1,如果我们把他做减1操作,然后再做&操作,如果为2的乘方,那么结果一定为0,即(n&(n-1)) = 0
例如正整数8,转化为二进制为100,那么进行判断就是(100 & (011)) = 0,所以8为2的乘方。
作者:pngcui
博客园:http://www.cnblogs.com/pngcui/
github:https://github.com/pngcui
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。

浙公网安备 33010602011771号