不用中间变量进行数值交换的算法

来源:互联网 发布:淘宝伴侣插件 编辑:程序博客网 时间:2024/05/18 01:33

呵呵,在网上偶尔看到的题~

 

冥思苦想半天,最后利用了异或(位加)位交换特性(位加三次,恰好满足(0,0),(0,1),(1,0),(1,1)的交换条件,很神奇)

不知其他人怎么做的:)

 

 

 

我的解法和思路:

1.两个数要交换,首先至少要先能达到二进制的位交换,加减由于要进位,感觉不能用在这里

2.与,或,非,异或,这四个位运算是可以不进位的,如果此题有解,那么必然是这些运算组合

3.经过尝试,得到下解满足条件(x,y)

(0,0)

x = x^y = 0

y = x^y = 0;

x = x^y = 0;

 

(1,0)

x = x^y = 1

y = x^y = 1

x = x^y = 0

 

(0,1)

 

x = x^y = 1

y = x^y = 0

x = x^y = 1

 

 

(1,1)

x = x^y = 0

y = y^x = 1

x = x^y = 1

 

 

这样,一位的数就成功交换了,

当然,32位的数当然也可以就此法来交换了

 

一个简单的C例子

 

int main(int argc, char* argv[])

{

    unsigned int x,y;

    x = 0x12345678;

    y = 0xFEDCBA98;

 

    x ^= y;

    y ^= x;

    x ^= y;

 

    /* x,y的值到此已交换过来了 */

    printf(......); 

    return 0;

}

 

 

哈哈,费了半天劲终于得到一个满意的解答了。

懒的在网上搜别人怎么做的了,不过据以往经验必然早有人比我做的更好:'(  

呵呵,0和1的智力游戏

 

 

到此,顺着这个思路我们可以得到更多解法,我们甚至可以写一个小程序来求解,(想起来上学时写的24点算法了,嘿嘿)

继续抽象...

这x和y只能以x@=y或y@=x或x=~x(@代表一种位运算)的形势存在,因为我们可以枚举

不可逆

x^=x x == 0

自身可逆无意义

x|=x; x == x

x&=x; x == x

经两次运算可逆

x=x^y

(0, 0) ...不用算了

(0, 1)经上运算(1, 1)再经上运算(0, 1)

(1, 0)和(1, 1)经过验证也是可逆

x=~x

这个一眼就看出是可逆的

 

 

求解小程序过几天发出来:)

 

 

 

原创粉丝点击