呀呀呀,《剑指offer》中有做过求1的个数的,时间久了又只会用移位的方式求解了,这不是最优解
一、求1的个数
int countOneNum(int val)
{
int iCount = 0;
while(val)
{
iCount++;
val = val & (val - 1);
}
return iCount;
}
/* ----------------------------
假设val等于11 1011
1.进入循环iCount先加1, 1011 & 1010 = 1010
2.iCount = 2, 1010 & 1001 = 1000
3.iCount = 3, 1000 & 0111 = 0000
4.循环判断条件结束,返回3
-------------------------------*/
二、求0的个数
int countZeroNum(int val)
{
int iCount = 0;
while(val + 1)
{
iCount++;
val = val | (val + 1);
}
return iCount;
}
/* ----------------------------
假设val等于11 1011
1.如果全1的话,加1就溢出为0了,不会进入循环
2.进入循环iCount先加1, 1011 | 1100 = 1111
3.1111 再加1就变为0000了,溢出了,判断条件不符合,返回1
-------------------------------*/