求一个正十进制数字,在二进制中存在1的个数.
例如:12这个数字 二进制为:00001100 存在两个1 打印2这个个数
原理:
//15 ---00001111
//15%2 = 1 说明第一位是1
//15/2 = 7 把第四位换成0 ---00000111
//7%2 = 1 说明第二位是1
//7/2 = 3 把第三位换成0 ---00000011
//3%2 = 1 说明第三位是1
//3/2 = 1 把第二位换成0 ---00000001
//1%2 = 1 说明第一位是1
//1/2 = 0 把第四位换成0 ---00000000
不理解可以看看这个视频:94. 算数转换作业讲解_哔哩哔哩_bilibili 跳到7:00的时间
他所使用的不是递归,下面是递归的代码:
int change(int n)
{
if (n % 2 == 1)
{
return 1+change(n / 2); //当有1的时候将返回的值+1,再进行计算
}
else if (n % 2 == 0 && n!=0)
{
return 0+change(n/2); //当是0时,不算返回的值+0(不加值),再进行计算
}
else if (n = 0)
{
return 0;//当数字为0时不必递归了,结束
}
}
int main()
{
int n = 12; //1100
int ret = change(n);
printf("%d\n", ret);
return 0;
}