求两个数二进制中不同位的个数
1.题目
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:1999 2299
输出例子:7
2.题目分析
- 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
- 统计异或完成后结果的二进制比特位中有多少个1即可
3.解法实现
3.1解法一:&
3.1.1函数实现
//方法一
int Count(int n, int m)
{
int i = 31;
int count = 0;
printf("%d的二进制位: ", n);
for(i=31;i>=0;i--)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("%d的二进制位:", m);
for(i=31;i>=0;i--)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
for (int i = 0; i <= 31; i++)
{
if (((n >> i) & 1) != ((m >> i) & 1))
{
count++;
}
}
return count;
}
3.1.2实际代入
//方法一
#include<stdio.h>
int Count(int n, int m)
{
int i = 31;
int count = 0;
printf("%d的二进制位: ", n);
for(i=31;i>=0;i--)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("%d的二进制位:", m);
for(i=31;i>=0;i--)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
for (int i = 0; i <= 31; i++)
{
if (((n >> i) & 1) != ((m >> i) & 1))
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
printf("%d和%d的二进制位有%d个不同", n, m, Count(n, m));
return 0;
}
3.1.3运行结果举例
解法二 :^ &
3.2.1函数实现
//方法二
int Count(int n, int m)
{
int i = 31;
int count = 0;
printf("%d的二进制位: ", n);
for (i = 31; i >= 0; i--)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("%d的二进制位:", m);
for (i = 31; i >= 0; i--)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
int N = n ^ m;
while (N)
{
N = N & (N - 1);
count++;
}
return count;
}
3.2.2实际代入
//方法二
#include<stdio.h>
int Count(int n, int m)
{
int i = 31;
int count = 0;
printf("%d的二进制位: ", n);
for (i = 31; i >= 0; i--)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("%d的二进制位:", m);
for (i = 31; i >= 0; i--)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
int N = n ^ m;
while (N)
{
N = N & (N - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
printf("%d和%d的二进制位有%d个不同", n, m, Count(n, m));
return 0;
}
3.2.3运行结果举例
解法三:% /
3.3.1函数实现
//方法三
int Count(int n, int m)
{
int i = 31;
int count = 0;
printf("%d的二进制位: ", n);
for (i = 31; i >= 0; i--)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("%d的二进制位:", m);
for (i = 31; i >= 0; i--)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
for (int i = 0; i <=31; i++)
{
if ((n % 2) != (m % 2))
{
count++;
}
n /= 2;
m /= 2;
}
return count;
}
3.3.2实际代入
//方法三
#include<stdio.h>
int Count(int n, int m)
{
int i = 31;
int count = 0;
printf("%d的二进制位: ", n);
for (i = 31; i >= 0; i--)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
printf("%d的二进制位:", m);
for (i = 31; i >= 0; i--)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
for (int i = 0; i < 32; i++)
{
if ((n % 2) != (m % 2))
{
count++;
}
n /= 2;
m /= 2;
}
return count;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
printf("%d和%d的二进制位有%d个不同", n, m, Count(n, m));
return 0;
}