A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈虹旭 于 2012-7-27 17:09 编辑
  1. //位置置换功能
  2. public static void swap(int[] arr,int a, int b)
  3. {
  4. int temp = arr[a];
  5. arr[a] = arr[b];
  6. arr[b] = temp;
  7. }
复制代码
这是一个位置置换功能,老师说可以用异或(^)的功能来写,我是0基础的,所以懂的不多,我很想知道如何将这个功能写成异或(^)的形式呢? 最好能给我解释下每个语句运行的原理 ,谢谢各位大虾了!

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

14 个回复

倒序浏览
//位置置换功能
public static void swap(int[] arr,int a, int b)
{
int temp = arr[a];//小明把他的东西给了temp
arr[a] = arr[b];//小王就把自己的东西给了小明
arr[b] = temp;//temp把小名的东西给了小王
}
回复 使用道具 举报
王渠 发表于 2012-7-26 20:04
//位置置换功能
public static void swap(int[] arr,int a, int b)
{

不是这个意思  这个我明白的  我是说如何用^的方式来写这个功能,怎么解释^的语句!  谢谢了  呵呵
回复 使用道具 举报
原理就是你两只手都拿着东西,你要把两个手的东西交换了,就要借助第三个东西,例如桌子,就相当于int temp = arr[a];   声明个临时变量,这样就把arr[a]的东西放到temp里了,然后再把 arr[b]的元素赋值给arr[a] ,arr[a] = arr[b];这样arr[b]的数据就放到a里,相当于你把左手的东西放到桌子上,在把右手的给左手,最后用右手拿起桌子上的东西,也就是 arr[b] = temp

回复 使用道具 举报
王楠 发表于 2012-7-26 20:11
原理就是你两只手都拿着东西,你要把两个手的东西交换了,就要借助第三个东西,例如桌子,就相当于int temp ...

:L  是我问的有问题么  我的意思是说用异或怎么写 异或的语句怎么解释!
回复 使用道具 举报
public static void swap(int[]arr, int a, int b)
{
  arr[a]=arr[a]^arr[b];
  arr[b]=arr[a]^arr[b];
  arr[a]=arr[a]^arr[b];
}
在给你一个简单的例子:
int x=3,y=6;
x=x^y;//x=3^6;
y=x^y;//y=(3^6)^6;y=3;
x=x^y;//y=(3^6)^3;x=6;
异或符号的特点:一个数异或另一个数两次,结果还是这个数。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
贾成龙 发表于 2012-7-26 20:21
public static void swap(int[]arr, int a, int b)
{
  arr[a]=arr[a]^arr;

明白了 感谢!
回复 使用道具 举报
不必,给点技术分就行啦!
回复 使用道具 举报
贾成龙 发表于 2012-7-26 20:43
不必,给点技术分就行啦!

这个    我还想要呢!   呵呵 :lol
回复 使用道具 举报
n = n ^ m;   //先用n记录住n^m的值
m = n ^ m; //(n^m)^m;由于一个数异或同一个数两次,结果还是本身的特点,这里n异或了m两次,所以为n还是本身n再次赋值给m
n = n ^ m; //n ^ (n ^ m);然后n在异或m而这个时候m变成了(n^m),由于那个特点,所以m就成了本身再次赋值给n
完成换位。

你是说这的原理是吗?

说实话 确实难理解。


评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1、异或是一个数学运算符。他应用于逻辑运算。 其运算法则为a异或b=a'b或ab'(a'为非a)。
  2、例如:真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。就是说两个值不相同,则异或结果为真。反之,为假。
  异或运算法则:
  1. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
  2. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
  3、在计算机应用中,普遍运用,异或的逻辑符号 ^ (Shift + 6).形象表示为:
  真^假=真
  假^真=真
  假^假=假
  真^真=假
  或者为:
  True ^ False = True
  False ^ True = True
  False ^ False = False
  True ^ True = False

点评

提醒一下张同学,如果要引用资料的话,请附上资料来源地址,否则会被判为抄袭。  发表于 2012-7-27 00:20
回复 使用道具 举报
这里有多种方法!
包括利用临时变量一共有四种吧!

/*********************/
利用临时变量。t为临时变量(最常用)
t = a ;a = b; b = t;
/*********************/
利用异或运算的方式。
a = a^b;
b = a ^b;
a = a ^b;
/*************/
不通过变量,直接运算(加法)
a= a +b;
a = a - b;
b = a - b;
/************/
不通过变量,直接运算(减法)
a =  a - b;
b = a + b;
a = b - a ;
以上一共四种方法可以实现两个数的置换方式。
当然其实在工作中,第一种方式是运用最多的。也是最常用的。
虽然耗一点点的内存,但其实这根本不算什么。
而第二种方式则运算效率较慢。
后面两种个人认为有点复杂。
回复 使用道具 举报
张水荣 发表于 2012-7-26 20:54
1、异或是一个数学运算符。他应用于逻辑运算。 其运算法则为a异或b=a'b或ab'(a'为非a)。
  2、例如: ...

OK!              
回复 使用道具 举报
1.arr[a] = arr[a] ^ arr;
2.arr = arr[a] ^ arr;
3.arr[a] = arr[a] ^ arr;
我相信异或是怎么运算的,楼主应该知道,这里说一下每一句话是怎么执行的
第一句话就是arr[a] ^ arr;没什么说好的

从第二句开始
arr = arr[a] ^ arr;因为第一句arr[a] = arr[a] ^ arr;
所以这里就是arr=(arr[a]^arr)^arr;红色部分就是上面的那个arr[a]
也就是说arr=arr[a];

第三句话
这句话等价于arr[a]=(arr[a]^arr)^arr[a];
也就是说arr[a]=arr;

这其实就跟初中那时候的数学运算时一样的
c=a+b
d=c+d
d=a+b+d
只是这个不能把结果赋给参与运算的数

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢各位大虾了  明白了  嘿嘿 !  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马