一、使用&运算,使用标记的二进制1,左移判断每个位的1
(如果将num数字右移,则可能判断不了负数,因为有符号位的存在)
#include<iostream>
int NumberOf1(int num)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (num & flag)count++;
flag <<= 1;
}
return count;
}
int main(int argc, char* argv[])
{
std::cout << NumberOf1(-3) << std::endl;
std::cin.get();
return 0;
}
2、利用二进制减1的特性
例如:
二进制1110,减1之后变为1101与原本的二进制数进行位与运算,则会变成1100
二进制1100,减1之后变为1011与原本的二进制数进行位与运算,则会变成1000
二进制1000,减1之后变为0111与原本的二进制数进行位与运算,则会变成0000
即有多少个1则会有多少次位与运算
int NumberOf1_2(int num)
{
int count = 0;
while (num)
{
++count;
num = (num - 1) & num;
}
return count;
}
int main(int argc, char* argv[])
{
std::cout << NumberOf1_2(3) << std::endl;
std::cin.get();
return 0;
}