第一行输入数字n(n<=50),表示有n组测试用例,第2到第n+1行每行输入数m(m为整数),统计并输出m用二进制表示时,1的个数。
例如:m=9时,二进制表示为1001,则输出2.
Input:
2
3
7
Output:
2
3
利用位运算
我的是直接用二进制的计算算出来的
1 #include<stdio.h> 2 int main() { 3 int n, m, i, sum = 0, yu; 4 scanf("%d", &n); 5 for (i = 0; i < n; i++) { 6 sum = 0; 7 scanf("%d", &m); 8 while (m) { 9 yu = m % 2; 10 if (yu == 1) { 11 sum++; 12 } 13 m = m / 2; 14 } 15 printf("%d\n", sum); 16 } 17 return 0; 18 }
而答案用了位运算&
#include<stdio.h> 2. 3.int bitcount(int x) { 4. int count = 0; 5. while (x != 0) { 6. x &= (x-1); 7. count++; 8. } 9. return count; 10.} 11. 12.int main() { 13. int num; 14. int x; 15. scanf("%d", &num); 16. 17. while (num--) { 18. scanf("%d", &x); 19. printf("%d\n", bitcount(x)); 20. } 21. return 0; 22.}
推荐阅读http://www.52rd.com/Blog/Archive_Thread.asp?SID=16977
或者百度知道http://zhidao.baidu.com/question/89293878.html?qbl=relate_question_0&word=c%D3%EF%D1%D4%CE%BB%D4%CB%CB%E3
& 按位与 //2个都是1才为1 //按位与运算通常用来对某些位 清0 (这道题就是清0)或保留某些位。
| 按位或 //1个为1就是1
^ 按位异或 // 相异时为1
~ 取反
<< 左移
>> 右移 //<<是左移,比如1<<n,表示1往左移n位,即数值大小乘以2的n次方
>>右移,类似左移,数值大小除以2的n次方
unsigned char x;
x=127;//(二进制:0111 1111)
//x<<1后的结果:1111 1110 <=> 254
printf(‘‘%o",x<<1); //按8进制输出376
优先级
1 |
~ |
2 |
<<、>> |
3 |
& |
4 |
^ |
5 |
| |
6 |
&=、^=、|=、<<=、>>= |
还有一个函数可以直接得到二进制数有多少个1
#include<stdio.h> int main() { int n, s; scanf("%d", &n); printf("%d", __builtin_popcount(n)); }
How many '1's are there
时间: 2024-10-13 08:11:57