问题描述
- *a1=*a1^*b1;这句的功能是什么
-
#include
int main(void)
{
int *a1,*b1,*c1,a,b,c;
a1=&a;
b1=&b;
c1=&c;
scanf("%d%d%d",a1,b1,c1);
if(*a1>*b1)
{
*a1=*a1^*b1;
*b1=*a1^*b1;
*a1=*a1^*b1;
}
if(*a1>*c1)
{
*a1=*a1^*c1;
*c1=*a1^*c1;
*a1=*a1^*c1;
}
if(*b1>*c1)
{
*b1=*b1^*c1;
*c1=*b1^*c1;
*b1=*b1^*c1;
}
printf("%d,%d,%d",*a1,*b1,*c1);}
解决方案
这句代码是异或的意思,默认用二进制计算,1 1得0 ,0 0得 0 ,1 0 得1 ,0 1 得1,每个if语句其实是在交换两个数,整个代码实现的功能是三个数从小到大排序
解决方案二:
比如a=1,b=2
那按位表示a最低4位是: 0001
b最低4位是:0010
*a1=*a1^*b1; //0001^0010=0011; a1=0011
*b1=*a1^*b1; //0011^0010; b1=0001;
*a1=*a1^*b1; //0011^0001=0010; a1=0010
交换了一下a1和b1
解决方案三:
异或一个数两次就相当于没有。所以上面if里是在交换数据,程序是在排序。
解决方案四:
其实就是交换a1和b1,玩弄了一个技巧。这种炫技毫无必要。
老老实实写
temp = a1;
a1 = b1;
b1 = temp;
就可以了。
解决方案五:
这个程序的功能是实现a,b,c三个数的排序,从小到大输出。
a= a^b;
b=a^b;
a=a^b;
这三行代码能实现数据的交换~这是不新开辟内存空间,比如第三个变量temp实现内存数据交换的方式~
但感觉这里写饶了,还是我没理解其内在的深意?用三个指针a1,b1,c1来访问内存a,b,c实现数据交换~
*a= a;
*b= b;
*c= c;
还是上面三行代码(a= a^b; b=a^b; a=a^b;)
感觉没有必要用指针呢~
时间: 2024-09-04 21:24:04