最美的代码-变量互换
时间:2009-03-26
来源:互联网
在往后翻了几页后,有一串代码,确实让我震撼了。
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

作者: 阿辛 发布时间: 2009-03-26
作者: 夜雨飘零 发布时间: 2009-03-26
这个也可以的.
作者: hoday 发布时间: 2009-03-26
PYTHON 的说
作者: iscien 发布时间: 2009-03-26
$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
作者: 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

作者: ieliwb 发布时间: 2009-05-28
作者: RZWWJ 发布时间: 2009-06-01
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28