啥如果你面试的时候面试官给你一道题说:“为了让我们的代码定义的变量少之又少,不要出现《屎山代码》,让你写一串代码,不创建第三个变量,从而交换两个变量。”
这时我们肯定会觉得十分简单,交换两个变量简直有手就行~信手拈来的写出来下面的代码:
#include <stdio.h>
int main()
{
int a = 10;
int b = 12;
int temp = 0;
temp = a;
a = b;
b = temp;
printf("%d %d", a, b);
return 0;
}
写完后的你还在沾沾自喜,可是面试官却只是邪魅一笑。
检查一番才发现事情不对劲,不知不觉中创建了第三个变量。
绞尽脑汁却只能说出:
也许有些聪慧过人的小伙伴已经想到了办法:
#include <stdio.h>
int main()
{
int a = 10;
int b = 12;
a = a + b;
b = a - b;
a = a - b;
printf("%d %d", a, b);
return 0;
}
面试官:
咳咳咳,言归正传,虽然该办法可取,但是有一个弊端,如果两个变量的和太大了int放不下,那么还是会出错。
这时候有同学就会出来反对了:用double啊,用long long啊
面试官:
虽然也没错,但是为了程序的更快捷运行,也为了占用少量的内存,我们便可以通过使用我们接触很少的操作符“^”来解决。
在此之前我们需要明白什么是^(异或)。
异或:异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0^0=0,1^0=1,0^1=1,1^1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
举个例子:a=11,a的二进制表示为1011,与0101进行^(异或)操作时,变成1110。
当一个数异或本身时,结果为0。即a^a=0。
一个数异或0时,等于它本身。即a^0=a。
了解以上运算规则后就可以开始写代码咯~
#include <stdio.h>
int main()
{
int a = 10;
int b = 12;
b = a ^ b;
a = a ^ b;//a=a^a^b=b,a^a=0,b^0=b
b = a ^ b;//b=b^a^b=a
printf("a=%d b=%d", a, b);
return 0;
}
有不足和改进之处欢迎留言评论。
喜欢就一键三连吧~