题目:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目引自。
算法分析:
第一眼看见题目的时候,最初的想法是对输入的整数对2取余,如果其结果为1就统计。但是这种做法会造成负数的统计不准确。
第二种方案,利用C语言的位运算,对整数的二进制中出现的1的个数进行统计。其统计的方法就是整数与数字“1”进行与运算(&)。低位到高位循环,与运算,左进一位。
算法实现:
int Count(int i) { int count = 0; unsigned int flag = 1; while(flag){ if(i & flag) count ++; flag = flag << 1; } return count; }
测试代码:
int main(void){ int num; while(scanf("%d",&num)) printf("%d\n",Count(num)); return 0; }
测试结果: