+ -
当前位置:首页 → 问答吧 → 最美的代码-变量互换

最美的代码-变量互换

时间:2009-03-26

来源:互联网

  今天在CSDN上看到一个帖子,标题是最经典的代码,很多人都发了自己认为很经典的代码。但是大多都吸引不了我的眼球。
 
  在往后翻了几页后,有一串代码,确实让我震撼了。
 
  a ^= b; b ^= a; a ^= b;
 
  就这三句,实现了 a b 两个变量的交换。
 
  以前我们传统的交换两个变量值的方法是用一个临时变量来进行过渡:
 
  temp = a; a = b; b = temp;
 
  而上面的语句却在两个变量之间进行了转换,感觉很奇妙,所以我特地的用PHP写了一个小程序,来分析他的运算过程:
 
  首先,来讲一讲 a ^= b; b ^= a; a ^= b; 的运算符,他用的是“ ^ 按位异或运算”。
 
  什么是异或运算呢?
 
  他是在计算机应用中,普遍运用,异或的逻辑符号 ^ (Shift + 6)。形象表示为:
  真 ^ 假 = 真
  假 ^ 真 = 真
  假 ^ 假 = 假
  真 ^ 真 = 假
 
  可以看到,当两个条件相同时,结果为假;当两个条件不同是,结果为真。
 
  好,我们现在来举个例子演示一下他的运算过程
 
  定义变量 a = 21, b = 45;
 
  a 转换成8位二进制:0001 0101
  b 转换成8位二进制:0010 1101   
 
  运算过程:
第一句:a ^= b;  等效于 a = a ^ b;
    二进制运算过程:
    0001 0101 a=21
    ^0010 1101 b=45
      --------------
    0011 1000 a=56 (此时的 a 已经变成了 0011 1000 转换成十进制:56)
 
第二句:b ^= a;  等效于 b = b ^ a;
    二进制运算过程:
    0010 1101 b=45   
    ^0011 1000 a=56
      --------------
    0001 0101 b=21 (此时的 b 已经变成了 0001 0101 转换成二进制:21。已经将变量a的值换到变量b里去了。)
 
第三句:a ^= b;  等效于 a = a ^ b;
    二进制运算过程:
    0011 1000 a=56   
    ^0001 0101 b=21
      --------------
    0010 1101 a=45 (此时的 a 已经变成了 0010 1101 转换成二进制:45。已经将变量b的值换到变量a里去了。)
 
  嘿嘿,两个变量就这么轻而易举的交换了,是不是很奇妙啊。哈哈……
 
  下面我吧我写的PHP程序放上来,让大家调试了看看:
  
  以下代码可以直接复制后运行 (PHP Version 5.2.6 Windows XP)

[code]

<?php

echo "演示 a ^= b; b ^= a; a ^= b; 交换两个变量值的过程:<br><br>";
$a = 21;
$b = 45;

echo "a = " . $a . " 转换成8位二进制:" . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . "<BR>";
echo "b = " . $b . " 转换成8位二进制:" . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . "<BR><BR>";

echo "运算 a ^= b; 等同于 a = a ^ b;<br>";
echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "<br>";
echo "    ^" . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "<br>";
echo "    --------<br>";
$a = $a ^ $b; // 执行第一句运算语句 并将结果赋给变量 a
echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "此时的 a 已经变成了 0011 1000 转换成十进制:56<br><BR>";

echo "运算 b ^= a; 等同于 b = b ^ a;<br>";
echo "    " . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "<br>";
echo "    ^" . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "<br>";
echo "    --------<br>";
$b = $b ^ $a; // 执行第二句运算语句 并将结果赋给变量 b
echo "    " . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "已经将变量a的值换到变量b里去了<br><BR>";

echo "运算 a ^= b; 等同于 a = a ^ b;<br>";
echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "<br>";
echo "    ^" . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "<br>";
echo "    --------<br>";
$a = $a ^ $b; // 执行第三句运算语句 并将结果赋给变量 a
echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "已经将变量b的值换到变量a里去了<br><BR>";

echo "输出运算结果:<br>";
echo "a = " . $a . " 转换成8位二进制:" . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . "<BR>";
echo "b = " . $b . " 转换成8位二进制:" . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . "<BR><BR>";

?>
[/code]


运算结果:
演示 a ^= b; b ^= a; a ^= b; 交换两个变量值的过程:
a = 21 转换成8位二进制:00010101
b = 45 转换成8位二进制:00101101
运算 a ^= b; 等同于 a = a ^ b;
    00010101 a = 21
    ^00101101 b = 45
    --------
    00111000 a = 56此时的 a 已经变成了 0011 1000 转换成十进制:56
运算 b ^= a; 等同于 b = b ^ a;
    00101101 b = 45
    ^00111000 a = 56
    --------
    00010101 b = 21已经将变量a的值换到变量b里去了
运算 a ^= b; 等同于 a = a ^ b;
    00111000 a = 56
    ^00010101 b = 21
    --------
    00101101 a = 45已经将变量b的值换到变量a里去了
输出运算结果:
a = 45 转换成8位二进制:00101101
b = 21 转换成8位二进制:00010101

作者: Svery   发布时间: 2009-03-26

奇妙的0和1哦,回想当年上学的时候都没好好学一下,总是感觉这种2进制啥的运算烦死了。

作者: 阿辛   发布时间: 2009-03-26

可读性不强 一般人不建议用

作者: 夜雨飘零   发布时间: 2009-03-26

$a=$a+$b;$b=$a-$b;$a=$a-$b;

这个也可以的.

作者: hoday   发布时间: 2009-03-26

a,b=b,a
PYTHON 的说

作者: iscien   发布时间: 2009-03-26

原帖由 hoday 于 2009-3-26 14:27 发表
$a=$a+$b;$b=$a-$b;$a=$a-$b;

这个也可以的.
位运算不会溢出, 加减运算会有溢出的危险.

作者: LanEast   发布时间: 2009-03-26

确实不错啊,支持

作者: T.T.R   发布时间: 2009-03-27

确实不错 但是 有个问题

$a='aa bb';
$b=4;

就不对了

作者: zuzu2009   发布时间: 2009-03-27

关注

作者: fengjinhua   发布时间: 2009-04-27

的确不错,用来学习PHP

作者: e_zailai   发布时间: 2009-05-14

不太理解。。

作者: anythink   发布时间: 2009-05-14

作者: fimos   发布时间: 2009-05-21

很经典的代码

作者: hh168   发布时间: 2009-05-22

很久以前就知道了……

作者: xieaotian   发布时间: 2009-05-22

挺有趣的.

作者: zaijiale   发布时间: 2009-05-25

其实二进制研究起来很有意思的

作者: 愁云惨淡   发布时间: 2009-05-26

研究一下可以~~不过平常使用,就不是很合适~~~~

作者: elsonwu   发布时间: 2009-05-28

bucuo

作者: ieliwb   发布时间: 2009-05-28

的确很奇妙

作者: RZWWJ   发布时间: 2009-06-01