回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C/C++ 技巧 >> 巧用异或交换整型变量的值
最 近 更 新
[转][C++] 巧用 mutable推荐
[C++] 巧用模板定义谓词
巧用异或交换整型变量的值
宏的一个妙用
[C/C++ 技巧] 提高程序..推荐
[C/C++ 技巧] 产生随机..
[C/C++技巧]巧用数组减..推荐
巧用移位运算避免乘法运算
无条件循环
最 新 推 荐
[转][C++] 巧用 mutable推荐
[C/C++ 技巧] 提高程序..推荐
[C/C++技巧]巧用数组减..推荐
热 门 排 行
[C/C++ 技巧] 产生随机..
[C/C++ 技巧] 提高程序..推荐
巧用移位运算避免乘法运算
[C/C++技巧]巧用数组减..推荐
宏的一个妙用
无条件循环
[转][C++] 巧用 mutable推荐
巧用异或交换整型变量的值
[C++] 巧用模板定义谓词
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

巧用异或交换整型变量的值


来源:蚂蚁的 C/C++ 标准编程 作者:Antigloss 等级:一般
发布于2007-06-10 19:42 被读976次 【字体:

通常,如果要交换两个变量的值,可以这么做:

    tmp = a;
    a   = b;
    b   = tmp;

如上所示,这需要定义一个辅助变量 tmp。使用异或可以避免使用额外的辅助变量。例如:

    #define swap(a, b) (a) ^= (b), (b) ^= (a), (a) ^= (b)

    #include <stdio.h>

    int main(void)
    {
        int ival1 = 10, ival2 = 20;

        printf("%d %d\n", ival1, ival2);
        swap(ival1, ival2);
        printf("%d %d\n", ival1, ival2);
    }

不过,使用异或有个局限性,就是只能用于整数类型。

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:C 语言运算符
51. 条件运算符(?:)
49. 逻辑运算符

上一篇:宏的一个妙用
下一篇:[C++] 巧用模板定义谓词

共有评论 12 条 网友评分 1分 查看全部评论

游客:thjgo
评分:0
还有个局限就是当a == b时,不能用。
游客:antigloss
评分:0
没有这个局限吧。愿闻其祥。
游客:forgot
评分:0
用+-写一个避免a==b
游客:antigloss
评分:0
+ - 有溢出问题
游客:jackdong
评分:0
确实好笑, 居然没有想到a=b!=0时, a^b=0,还这么交换, 而且效率也没有用临时变量快
游客:antigloss
评分:0
1. 对,如果 a == b,那么 a^b 的确为 0,但影响交换么?至少我测试的结果是没问题的。鄙人愚笨,实在想不出哪里会有问题,不知你可否详细道来?

2. 我说过用异或效率高么?没有。我不过是说有这么一种方法可以交换整型变量的值而已。
游客:aipb2007
评分:0
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define swap2(a,b) (a)+=(b),(b) = (a)-(b),(a)-=(b)

两种都可以,没楼上说的什么 == 局限
要说效率,这个整数交换,根本不能做出效率优劣判断,这要看cpu指令是怎么解析。
游客:antigloss
评分:0
你上面说的第二种方法存在溢出问题。而有符号数溢出是未定义行为。

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss