对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数.
Claim: 算法执行效率尽可能高
Example:
Input:
[162]
Output:
[3]
Thinking:
M1: 比较暴力的方法,依次遍历每一个二进制位,判断该二进制是否为1。
1. 依次对二进制数右移1位(等同除2操作);
2.该数与1进行"与"操作后仅有0和1两种结果,最后一位为1则“与”运算结果为1.
M2: 简化问题,判断二进制位只有1个1的做法,对二进制数01000, 01000 & (01000 - 1) = 01000 & 00111 = 0。因此判断二进制数1个数也可以采用相同方法。
1. 将n与n-1进行"与"操作();
2.计数器累加即得到最终结果。
M3: 创建一个大小为256的整数数组,将0~255中"1"的个数存储起来,数组内数字表示对应位置上二进制数的1的个数。
Code:
M1_Code:
void Count(int n)
{
int num = 0;
while(n)
{
num += n & 0x01;
n >>= 1;
}
cout << "number 1 int " << n << " have " << num << endl;
}
M2_Code:
void Count(int n)
{
int num = 0;
while(n)
{
n &= n-1;
num++;
}
cout << "number 1 int " << n << " have " << num << endl;
}