懂二进制(牛客网)
程序员文章站
2022-04-04 20:33:19
...
解题思路:
1.对输入的两个数进行异或运算,运算符为^; 相异位1 相同为0
2.统计异或运算后所得数中1的个数即可;
难点:如何统计一个数中1的个数? 重要公式:n=n&(n-1)
代码如下:
#include<stdio.h>
int count(int m, int n)
{
int q=0;
int cnt1=0;
q=m^n;//异或运算
while(q)
{
cnt1++;
q=q&(q-1);//公式
}
return cnt1;
}
int main()
{
int m,n;
int cnt=0;
scanf("%d%d",&m,&n);
cnt=count(m,n);
printf("%d\n",cnt);
return 0;
}
公式解释如下:
计算机里的数字本来就是用二进制存的,所以计算过程也都是二进制计算。
利用一些位运算的特性,可以很容易计算1的个数。
有一个很有意思的特性:随便给一个二进制数,比如n=10001100,我们把它减一:n-1=10001011。重新摆放一下观察:
10001100 (n)
10001011 (n-1)
通过观察得出,n中为1的最低位是第3位,而n-1和n的低3位全都不同。如果进行“按位与”操作,即 n & (n-1) = 10001000。
10001100 (n)
10001011 (n-1)
10001000 (n & (n-1))
可以看到底3位都变成了0。
如果你数学足够好,可以得出结论:
[结论]要消除整数n最低位的1,可以使用 n = n & (n-1)。
利用结论,想要求二进制中有多少个1就很容易了。
每使用一次公式,可以消掉一个1,而且这个1是该数从右往左第一个1(最低位的1)。
统计一个数中有多少个1还有其他方法,但上述法是效率最高的。在此不叙述其他方法。