交换整数值

 错误示范

#include <stdio.h>

void swap(int x,int y)

{

        int temp=x;

        x=y;

        y=x;
}

int main()

{

        int a=10,b=20;

        printf("交换前:a=%d b=%d\n",a,b);

        swap(a,b);

        printf("交换后:a=%d b=%d\n",a,b);

        return 0;

}

 最后输出结果:

        交换前:a=10 b=20

        交换后:a=10 b=20

为什么?

        x,y为形参,函数内对形参的改变不影响实参a,b。

使用指针

#include <stdio.h>

void swap1(int *x,int *y)                                    //此处*代表x,y为指针变量

{

        int temp=*x;                                              //此后*为解指针操作,即*x表示x所指的值

        *x=*y;

        *y=*x;
}

int main()

{

        int a=10,b=20;

        printf("交换前:a=%d b=%d\n",a,b);

        swap1(a,b);

        printf("交换后:a=%d b=%d\n",a,b);

        return 0;

}

 最后输出结果:

        交换前:a=10 b=20

        交换后:a=20 b=10

不想用指针变量

#include <stdio.h>

void swap2(int &x,int &y)                            //&为引用,引用变量作为目标变量别名使用

{

        int temp=x;

        x=y;

        y=x;
}

int main()

{

        int a=10,b=20;

        printf("交换前:a=%d b=%d\n",a,b);

        swap2(a,b);

        printf("交换后:a=%d b=%d\n",a,b);

        return 0;

}

 最后输出结果:

        交换前:a=10 b=20

        交换后:a=20 b=10

不想写函数

#include <stdio.h>

int main()

{

        int a=10,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;

}

 最后输出结果:

        交换前:a=10 b=20

        交换后:a=20 b=10

怎么回事?

位运算 ^ 异或,相同为0,相异为1

原码:符号位加上真值的绝对值

反码:正数反码与原码相同;负数反码符号位不变,其余位取反。

补码:正数补码与原码相同;负数补码=反码+1。

例如:

4的二进制:00000100——原码

8的二进制:00001000——原码

4的二进制:00000100——补码

8的二进制:00001000——补码

4^8:00000100

        ^

       00001000

     =00001100;

那么整数a,b

a^a=0,b^0=b;

        a=a^b;

        b=a^b;     //b=a^b^b=a^0=a

        a=a^b;     //a=a^b=a^b^a=b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值