题目1:
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("交换前:a = %d b = %d\n", a,b);
a = a^b;
b = a^b;
a = a^b;
printf("交换后:a = %d b = %d\n", a,b);
return 0;
}
异或: ^ 相同为0 , 相异为1;
解答说明:
10转为二进制数为01010
20 转为二进制数为10100
进行异或后 a : 11110
此时a再与b异或 b: 01010
此时a再与b异或a:10100
题目2:
根据按位与原则: 对应位全为1才为1,则我们可以用1对每一位进行按位与
int NumberOf1(int n )
{
int a = 0;
for (int x = 1; x <= 32; ++x)
{
int k = 1 & n;
if (k)
{
a++;
}
n= n >> 1;
}
return a;
}
题目3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int c = a ^ b;
int g = 0;
for (int x = 1; x <= 32; ++x)
{
int k = 1 & c;
if (k)
{
g++;
}
c = c >> 1;
}
printf("%d", g);
return 0;
}
解答:根据异或原则;相同为0 , 相异为1。逐渐右移,再与1进行异或
最后可得出不同的位置数目