http://blog.csdn.net/hitwhylz/article/details/10122617 看到这种要计算二进制什么鬼的,就自然而然想到用位运算 //二进制中1的个数 #include <iostream> using namespace std; int main() { int num,count=0; cin>>num; while(num!=0) { /* 1、 count += n&1; num>>=1; */ /* 2、 //count += n%2; //num/=2; */ //3、 num &= num-1; count++; } cout<<count; return 0; } //第一种方法: int Hamming_weight_1( int n ) { int count_ = 0; //声明计数变量 while ( n != 0 ) //遍历 { if( n%2 == 1 ) //满足尾数是1. count_++; n /= 2; //除2,右移一位。(二进制) } return count_; } /* 上下两种方法其实是一样的,只不过下面一种是用位运算来代替算术运算 第二种(位运算): 例子: 100&001=0 10&01=0 1&1=1 */ //Hamming_weight算法1---逐个数(位运算) int Hamming_weight_1( int n ) { int count= 0; //声明计数变量 while ( n != 0 ) //遍历 { count+= n & 1; //尾数按位与1 n >>= 1; // 右移一位 } return count; } /* 第三种方法:(也是位运算) number&= number-1 -----只与二进制中1的位数相关的算法 拿7(111)来做例子, 第一次 111&110=110,这次操作成功的把从低位起第一个1消掉了,同时计数器加1。 第二次110&101=100,同理又统计了高位的一个1,同时计数器加1。 第三次100&011=000,同理又统计了高位的一个1,同时计数器加1。 此时n已变为0,不需要再继续了,于是111中有3个1。 */ //二进制中1的个数 #include<stdio.h> //Hamming_weight算法二---只考虑1的位数 int Hamming_weight_2( int number ) { int count_ = 0; //声明计数变量 while ( number != 0 ) //遍历 { number &= number-1; count_ ++; } return count_; } int main() { int n; while ( scanf("%d", &n) != EOF ) //读入整数和打印1的个数 { printf("%d ", Hamming_weight_2( n )); } return 0; }