Jul 20

PHP最美的代码-变量互换 不指定

sky , 14:07 , 默认分类 , (2) , (0) , (2397) , Via | |
  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)






echo "演示 a ^= b; b ^= a; a ^= b; 交换两个变量值的过程:

";

$a = 21;

$b = 45;



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

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

";



echo "运算 a ^= b; 等同于 a = a ^ b;
";

echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "
";

echo "    ^" . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "
";

echo "    --------
";

$a = $a ^ $b; // 执行第一句运算语句 并将结果赋给变量 a

echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "此时的 a 已经变成了 0011 1000 转换成十进制:56

";



echo "运算 b ^= a; 等同于 b = b ^ a;
";

echo "    " . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "
";

echo "    ^" . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "
";

echo "    --------
";

$b = $b ^ $a; // 执行第二句运算语句 并将结果赋给变量 b

echo "    " . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "已经将变量a的值换到变量b里去了

";



echo "运算 a ^= b; 等同于 a = a ^ b;
";

echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "
";

echo "    ^" . str_pad(decbin($b), 8, "0", STR_PAD_LEFT) . " b = " . $b . "
";

echo "    --------
";

$a = $a ^ $b; // 执行第三句运算语句 并将结果赋给变量 a

echo "    " . str_pad(decbin($a), 8, "0", STR_PAD_LEFT) . " a = " . $a . "已经将变量b的值换到变量a里去了

";



echo "输出运算结果:
";

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

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

";



?>
复制代码运算结果:
演示 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
Ian Email Homepage
2010-7-23 15:58
不明真相的围观群众路过了
dfssaa 2010-8-6 10:08
不明真相的围观群众围观中
小罗 Email Homepage
2010-7-25 19:19
当初php没怎么学啊,唉,后悔了!
dfssaa 2010-8-6 10:08
要学的太多了,哎
1/1 1

[] []