交换两个数的值的方法

一、引入中间变量temp 

int a = 1;
int b = 2;
int temp;
temp = a;
a = b;
b = temp;

二、a , b两数的加减运算

int a = 1;
int b = 2;
a = a+b;
b = a-b;
a = a-b;

三、a , b两数的乘除运算 

//乘除法类似上面的加减法
int a = 1;
int b = 2;
a = a * b;
b = a / b;
a = a / b;

【注意】 加减乘除运算是可能导致数值溢出的问题,例子如下。


四、异或运算(不会产生溢出问题)

int a = 1;
int b = 2;
a = a^b;// = 01 ^ 10 = 11
b = a^b;// = 11 ^ 10 = 01 = 1
a = a^b;// = 11 ^ 01 = 10 = 2

异或:一般是针对二进制数来说的,做异或运算需要把其他进制数转换成二进制数,例如十进制的a=1,b=2,转换成二进制就是a=1,b=10。异或的规则就是如果两个二进制数对应位不相同,则异或结果为1,若相同,则异或结果为0。如果两个二进制数的位数不相同,则对于位数少的那个数进行高位不0,例如二进制的a=01,使二进制时的a,b两数位数相同。 

五、用位运算交换

#include<stdio.h>

int main()
{
    int a=10;
    int b=20;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    b = (__int64)((__int64)a << 32 | (a = b)) >> 32;
    printf("交换前a,b的值分别为:\n");
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    return 0;
}

最后,介绍一种高逼格的方法,很少人会想到。__int64表示64位整型变量,这个在VC6.0里是支持的。
b = (__int64)((__int64)a << 32 | (a = b)) >> 32; 这个语句中a=b的值为b的值20,同时把b的值赋给a。整个语句的意思:先把a强制转化为64位整型变量,然后把它左移32位后与(a=b)按位或,把整个结果再强制转换为64位整型变量,然后右移32位得到b的值。其实,求b的值没必要有|(a=b)这部分,但因为想同时把b的值赋给a,且把|(a=b)放在这儿不会影响到b最终的值,所以写成这样。这儿就采用移位的方法避免了用中间变量。 

猜你喜欢

转载自blog.csdn.net/tjh625/article/details/81139859