黑马程序员技术交流社区

标题: c语言的变量对换问题 [打印本页]

作者: Ye•Ye    时间: 2014-5-6 11:56
标题: c语言的变量对换问题
本帖最后由 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。请问这是怎么回事?

作者: 蜗牛强    时间: 2014-5-6 13:07
本帖最后由 蜗牛强 于 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     

作者: godlike    时间: 2014-5-6 13:14
这个我做过专门的总结:
方法一:利用数学运算的技巧
  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





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2