Embarcadero加油

呵呵呵。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

本txt致力于展示位运算的美丽技巧的巧妙应用。利用了位运算之异或运算的一个美丽的特性。自己每次都要睁大了眼睛看哦。呵呵。当然了,这个是从基本做起来的。请认真explore it 吧。。。

看代码例子: 

class BitOperation {
public static void main(String[] args) {
System.out.println("需求:交换两个变量的值");

int m = 4, n = 9;
System.out.println("Before our exchange:" + " m=" + m + " n=" + n);

System.out.println("-----------第一种方法---------------");
int temp;
temp = m;
m = n;
n = temp;
System.out.println("After our exchange:" + " m=" + m + " n=" + n);

m = 4;
n = 9;
System.out.println("-----------第二种方法(不使用临时变量来实现)---------------");
n = n + m;
m = n - m;
n = n - m;
System.out.println("After our exchange:" + " m=" + m + " n=" + n);

m = 4;
n = 9;
System.out.println("-----------第三种方法(也是不使用临时变量来实现)---------------");
n = n ^ m;
m = n ^ m;
n = n ^ m;
System.out.println("After our exchange:" + " m=" + m + " n=" + n);

}
}

具体分析:
>局部:第一点:(第一种方法)自己以前,就只是知道,每次交换位置的时候,就搞个临时变量,然后弄个跟三角形的关系似的东东就换过来了。
评评:此种思想是平时最容易想到的,也是实际开放中真正会去应用到的。因为后面两点都不好想到。也就是说,这个是传统思维,也是直接思维。

第二点:(第二种方法)求和,再分别去减下彼此。思路不错。
评评:虽然可以实现功能,但是,不要忽略了它的略根性,即可能带来的新的问题--int类型数据范围是比较大的,最大值是2的31此方-1,那么,
n = n + m这一步操作,当n和m非常大的时候,可能损失精度。是不行的。

第三点:(第三种方法)采用二进制位异或操作法。直接进行交换了。厉害呀。
评评:这个思路好厉害。利用了知识点,也是异或的特性:一个数a去异或另外一个数字两次,结果还是这个数a。佩服这个东东。这个评价给最高分。但是,
实际中,并不好想到。所以,要知道,最实用的还是第一点的第一种方法。(建议:观察这个的特点,很好背住哦。不过,还是理解万岁呀。)

>全局:
注意,在每一次的使用新方法进行数据交换之前,必须数据重新置位到初始化状态呀。否则,你就等着看错误结果吧。这个注意呀。


问题分析和解决时间:2011/12/04/4:40(算法篇)

posted on 2011-12-09 17:26  评评  阅读(237)  评论(0编辑  收藏  举报