A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Ye•Ye 中级黑马   /  2014-5-6 11:56  /  1250 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Ye•Ye 于 2014-5-7 15:34 编辑

请问^是相同为0不相同为1吧?那么不经过第三个变量调换两个变量的值:

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

这样对调的结果不对啊,比如:
int i = 6;

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

printf("%d %d\n",i);

结果是0,0。请问这是怎么回事?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 蜗牛强 于 2014-5-6 14:19 编辑

楼主的代码有很多问题啊,变量都对应不上,程序应该这样写就可以对调了。
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int a=6,b=7;
  5.         a^=b;
  6.         b^=a;
  7.         a^=b;
  8.         printf("%d %d",a,b);
  9.         return 0;
  10. }
复制代码
异或运算过程:程序走向→
          a^=b     b^=a    a^=b
a=6:1010      0001     0001     1011     7

b=7:1011      1011     1010     1010     6
a^b:0001      1010     1011     
回复 使用道具 举报
这个我做过专门的总结:
方法一:利用数学运算的技巧
  1. 2 int main()
  2. 3 {
  3. 4     
  4. 5     int a =10, b = 20;
  5. 6     
  6. 7     printf("交换前a=%d, b=%d\n", a, b);
  7. 8     
  8. 9     a = a - b;
  9. 10     b = a + b;
  10. 11     a = b - a;
  11. 12     
  12. 13     printf("交换后a=%d, b=%d\n", a, b);
  13. 14     
  14. 15     return 0;
  15. 16 }
复制代码

这种方法的写法不唯一,对于a,b;只要先给其中一个先赋予a-b,其他的自己算一下就能写出来;
方法二:异或运算的特点:a^b^a = a^a^b = 0^b = b,交换律,相同数值异或为0,0和任何数异或为任何数
  1. 2 int main()
  2. 3 {
  3. 4     int a =10, b = 20;
  4. 5     printf("交换前a=%d, b=%d\n", a, b);
  5. 6     
  6. 7     a = a^b;
  7. 8     b = b^a;
  8. 9     a = a^b;
  9. 10     
  10. 11     printf("交换后a=%d, b=%d\n", a, b);
  11. 12     
  12. 13     return 0;
  13. 14 }
复制代码

第三方变量的方法,就很简单了,也是最长用得;掌握了第三方变量的方法,基本就行了;
楼主可以看看我的博客里写的:http://www.cnblogs.com/cxbblog/p/3704899.html

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马