首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

变量交换

2012-12-26 
变量互换今天在CSDN上看到一个帖子,标题是最经典的代码,很多人都发了自己认为很经典的代码。但是大多都吸引

变量互换

今天在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>";

?>
运算结果:
演示 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

?

?

?

两变量互换不借助第三变量2011-03-13 23:34

1.异或

a = a ^ b;

b = b ^ a;

a = a ^ b;

?

2.加减

a = a + b;

b = a - b;

a = a -?b;

?

3.乘除

a = a * b;

b = a / b;

a = a / b;

?

4.

a + b - (b = a);

热点排行