举例
5的二进制位:00000000000000000000000000000101
这样我们能够很直接的看出有两个1
1.运用>>操作符和1的补码特性实现
直接for循环32次,每向右移位一次,让m & 1然后进行比较,m&1的结果为1时,计数器c++;最后返回即可
int count_number_of_1(int m)
{
int c = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((m & 1) == 1)
{
c++;
}
m >>= 1;
}
return c;
}
2.运用 /2 %2的方法取出每一位
这个方法可以用十进制的数字来理解
1234
1234%10 = 4 1234/10 = 123 ①
123%10 = 3 123/10 = 12 ②
12%10 = 2 12/10 = 1 ③
1/%10 = 1 1/10 = 0 ④
下面实现二进制的:这里需要注意的是我们输入的变量类型是int有符号的,在形参处我们需要用unsigned int无符号来接受(处理负数)
int count_number_of_1(unsigned int m)
{
int c = 0;
while (m)
{
if (m % 2 == 1)
{
c++;
}
m /= 2;
}
return c;
}
3.一个很妙的算法 - m&(m-1) - 会去掉m的二进制为最右边的1
注:此方法可以判断一个数是否是2^n,m & (m-1) == 0
int count_number_of_1(int m)
{
int c = 0;
while (m)
{
m &= (m - 1);
c++;
}
return c;
}
例题
Leetcode:面试题 05.06. 整数转换