C语言函数:用位运算交换的方法交换两个变量值

1void inplace_swap(int *x, int *y) 2{ 3    *= *^ *y; //Step 1 4    *= *^ *y; //Step 2 5    *= *^ *y; //Step 3  6} 7 8int main() 9{ 10    int num1 = 100; 11    int num2 = 200; 12    inplace_swap(&num1, &num2); 13    printf("num1=%d\nnum2=%d\n", num1, num2); 14    return 0; 15}

    相比使用一个局部变量来交换两个变量的值,这种方法并没有性能上的优势,只是一种对位运算的练习。

    一个数与它本身异或,结果为0。假设*x = a;*y = b;

*x

*y

Step0

a

b

Step1

a

a ^ b

Step2

a ^ a ^ b ( = b)

a ^ b

Step3

b

a ^ b ^ b ( = a)

    不过,需要注意,*x与*y指向同一个位置时,*x与*y指向的数变为0

    例如将一个数组中的元素首尾对调的时,使用下面的函数

1    void reverse_array(int a[], int cnt) 2    { 3        int first, last; 4        for (first = 0, last = cnt - 1; first <= last; first++, last--) 5        { 6            inplace_swap(&a[first], &a[last]); 7        } 8    }

    如果数组长度为奇数是,中间的数会变成0

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  

P2P技术揭秘.P2P网络技术原理与典型系统开发

Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E