不用中间变量进行数值交换的算法
来源:互联网 发布:淘宝伴侣插件 编辑:程序博客网 时间: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
这个一眼就看出是可逆的
求解小程序过几天发出来:)
- 不用中间变量进行数值交换的算法
- [转]不用中间变量交换两个数值变量的值
- 不用中间变量进行两个数的交换(C语言)
- 不用中间变量进行两个int值的交换
- C语言位操作--不用中间变量交换两数值
- c面试题:不用中间变量,完成数值交换!
- 判断两个数值中最大的一个以及不用中间变量交换两个数
- 不用中间变量完成数据的交换
- 不用中间变量实现交换
- 不用中间变量实现交换
- 不用中间变量实现交换
- 不用中间变量实现交换
- Java 交换值算法 不用中间变量,换运算
- 不用中间变量,交换两个变量的值的方法
- 不使用中间变量交换两个数值变量的值
- 不用中间变量,实现两个变量的交换
- 两个变量不用中间变量交换值的方法
- 不用中间变量交换两个整型变量的值
- 基于IOC的Java事件框架的设计与实现Ⅰ
- 基于IOC的Java事件框架的设计与实现 Ⅱ
- 基于IOC的Java事件框架的设计与实现 Ⅲ
- 致刚入门的程序员五点建议(转载自雷军博客www.leijun.com )
- Linux的ftp服务vsftp详细配置
- 不用中间变量进行数值交换的算法
- linux:diff - 命令
- URLVariables几种书写方式
- 孩子成年前要明白10个道理
- 位段举例
- 设计一个计时器
- 基础的makefile
- stl::map( constructor,insert,iterator) 1
- flex垃圾回收机制