首先先上一波题目:
AC代码如下:
#include<stdio.h>
int main()
{
long long a;
while (scanf_s("%lld", &a)!= EOF)
{
long long b = a ^ (a - 1);
int num = 0;
while (b)
{
if (b & 1)
{
num++;
}
b >>= 1;
}
printf("%d\n", num);
}
return 0;
}
ps:编译环境vs2019,代码中_s为vs2019的安全写法,其他编译环境可以将其去掉
代码详解
n^(n-1)的目的是为了确定操作要进行几次(为后续真正的确定此时做准备)
举个例子10(10进制)———》1000(2进制);1000^111(二进制目标7)== 1111(几个1就相当操作了几次)
b&1————>为了确定b末尾是否为1 是1就++一下
b>>相当于进行下一次处理,将判断完的末尾移除,下一位准备下一次接受处理。
最后的num就是处理的次数。