//算法复杂度只与1的个数有关
int main()
{
int num,i =0;
cin>>num;
//将num的二进制中从低位到高位中的1逐一变为0,当1均被处理,num变为0,退出while。
while (num)
{
num -= num&(-num); // 与该语句实现同样功能的另一方法为: num &=(num-1); 将当前num二进制中从右往左出现的第一个1变为0;
i++;
}
cout<<i<<endl;
system("pause");
return 0;
int main()
{
int num,i =0;
cin>>num;
//将num的二进制中从低位到高位中的1逐一变为0,当1均被处理,num变为0,退出while。
while (num)
{
num -= num&(-num); // 与该语句实现同样功能的另一方法为: num &=(num-1); 将当前num二进制中从右往左出现的第一个1变为0;
i++;
}
cout<<i<<endl;
system("pause");
return 0;
}
输入 -3;运行结果为:
可知,当num = -2^31(-2147483648)时, 该值为32位有符号int所能表示的最小整数,此时num-1 变为 2147483647(32位有符号int所能表示的最大整数), num = num &(num-1)为0.退出循环。