关闭

iOS中实现数据交换的几种方法介绍以及其效率对比

标签: 交换赋值数据交换亦或
260人阅读 评论(0) 收藏 举报
分类:

两个数据交换在编程中很常用,比如排序算法中就经常要用到,下面介绍常用的三种方法,并对它们的效率作出对比,以便在大量用到交换的程序中提高效率。

第一种方法,使用一个临时temp,代码如下:

    int a1 = 3;
    int a2 = 5;
    int temp;
    temp  =  a1;
    a1  =  a2;
    a2  =  temp;

第二种方法,直接不用额外的存储空间,直接在两个数据上操作,但是这种方法有可能在两个数相加时产生越界的问题。代码如下:

    int b1 = 3;
    int b2 = 5;
    //b1 = b1 + b2
    //b2 = b1 + b2 - b2 = b1
    //b1 = b1 + b2 - (b1 + b2 - b2) =b2
    b1  =  b1  + b2;
    b2  =  b1  - b2;
    b1  =  b1  - b2;

第三种方法是使用异或运算符 亦或运算

    int c1 = 3;
    int c2 = 5;
    NSLog(@"转换前的值a=%d,b=%d",c1,c2);
//    a=a^b;
//    b=b^a;
//    a=a^b;
    c1 ^= c2;
    c2 ^= c1;
    c1 ^= c2;
    NSLog(@"转换后的a=%d,b=%d",c1,c2);

// 2017-11-13 14:36:19.610391+0800 arithmetic[7331:360857] 转换前的值c1=3,c2=5 
// 2017-11-13 14:36:19.610558+0800 arithmetic[7331:360857] 转换后的c1=5,c2=3

亦或计算口诀:相同取0,相异取1 
现实中用的都是十进制的数值,那么我们来看一看两个十进制数值是怎么进行异或计算: 
5 ⊕ 3 = ? 
1.进行异或计算前会把数值都转换为二进制: 
5和3转为二进制分别为:0101 、0011 
0101 
xor 0011 
———— 
结果 0110 
2.再把结果 0110 转换为十进制的:6 
3.所以 5 ⊕ 3 = 6

通过我的程序运行对比,得到以下结果:

结果显示,第一种方法效率是最高的,虽然第一种方法占据一个额外的内存空间,但是交换的三行代码实现的都是赋值操作,相对后两种的加减和异或要快很多。所以,当交换量大时,推荐用第一种方法,速度快,而且最容易理解。其次是第三种方法比较快,最次的是第二种方法,不过第二种方法和第三种方法的效率相差不多。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:161913次
    • 积分:4360
    • 等级:
    • 排名:第7612名
    • 原创:200篇
    • 转载:46篇
    • 译文:0篇
    • 评论:87条
    博客专栏
    文章分类
    GitHub
    https://github.com/liyuunxiangGit