一、基本思路?
通过&操作符与目标二进制数进行匹配(win32)
00000000000000000000000000101101-a
00000000000000000000000000000001-b
如果a&b的结果为1,测利用计数器进行记录,然后b>>1,循环32次,最后输出计算器即可
二、相关操作符讲解
1.位操作符
| 按位或
& 按位与
^ 按位异或
注:他们的操作数必须是整数。
代码如下(示例):
int main()
{
int a = 3;
//00000000000000000000000000000011
int b = 7;
//00000000000000000000000000000111
printf("%d\n", a | b);
//00000000000000000000000000000011
//00000000000000000000000000000111
//只要有一个为1,就为1
//00000000000000000000000000000111-7
printf("%d\n", a & b);
//00000000000000000000000000000011
//00000000000000000000000000000111
//同时为1才为1
//00000000000000000000000000000011-3
printf("%d\n", a ^ b);
//00000000000000000000000000000011
//00000000000000000000000000000111
//相同为0,相异为1
//00000000000000000000000000000100-4
return 0;
}
输出结果如下
2.左移右移操作符
左移操作符<<
右移操作符>>
注:移位操作符的操作数只能是整数。
代码如下(示例):
int main()
{
int a = 3;
printf("%d\n", a >> 1);
//00000000000000000000000000000011
//右移一位,右边丢失,左边补0
//00000000000000000000000000000001-1
printf("%d\n", a << 1);
//00000000000000000000000000000011
//左移一位,左边丢失,右边补0
//00000000000000000000000000000110-6
return 0;
}
运行结果如下
这里在介绍操作符的时候,我们都是用的整数作为例子,并且在右移操作符 的时候,我们其实有两种规则(采用哪种规则取决于编译器)要想了解更多有关操作符的内容,可以去我的主页查看另一篇文章
三,代码的实现
//当n等于负数时,需要将负数转化位无符号数————unsigned
int Count(unsigned int n)
{
int count = 1;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;
}
return count;
}
int Count(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (n & 1 == 1)
{
count++;
}
n = n >> 1;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);//10
int ret = Count(a);//2
printf("%d", ret);
return 0;
}
这里我写两种代码来实现,第一种常规的方法就没有过多的介绍,大家一看也就明白了。
这里我介绍的这个算法还是可以再优化的,因为在循环的时候,无论后面有没有1了,for()都是会循环完32遍
以上就是本篇博客的内容了,欢迎大家评论