黑马程序员技术交流社区
标题:
不用第三方变量进行两数交换的问题
[打印本页]
作者:
ixiangfeng
时间:
2013-10-31 13:58
标题:
不用第三方变量进行两数交换的问题
public class Xiaohuihui {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
int b = 12;
a = a + b;
b = a - b;
a = a - b;
System.out.println(Integer.MAX_VALUE);
System.out.println(a);
System.out.println(b);
}
}
复制代码
这问题是昨天一哥们问的 但是问题还没解决他就改为提问结束了 所以我再来求助
毕老师的视频也说是有bug的 就是当两个数之和超过int类型时会溢出 我也一直是这样觉得的 但昨天那位兄弟提出这个问题时我去测试过的确地可以转换的 而且两数之和也的确溢出了 为什么会这样呢? 要么是毕老师说错了我自己也理解错了 要么就是还有哪里没注意到 求高手指点
各位兄弟麻烦看清楚我问的是什么 不要再给我说例如下面这些东西了
//小练习:将两个变量内部的值进行互换。
//1,通过第三方变量。
int temp;
temp =n;
n=m;
m=temp;
//2,不用第三方变量
/*
11=3+8
8=11-3
2=11-8
*/
n=n+m;
m=n-m;
n=n-m;//但是,这种方法有局限性,如果n,m值非常大,则会超出int范围。
n=n^m;
m=n^m;//^:亦或.。此时的表达式是:(n^m)^m【但是,此时m的值已经变为之前的n的值了】
n=n^m;// 此时的表达式是:(n^m)^n
//一个数,如果同时对一个数异或两次,那就是原数。
作者:
ixiangfeng
时间:
2013-10-31 13:59
搞不清楚心里不舒服啊~~ 求大神指点一下
作者:
星星点灯
时间:
2013-10-31 16:04
可以尝试以下方法
//test.java
public class test
{
public static void main(String[] args)
{
//正数极限测试
int a=2147483647;//此测试数已达int类型正数部分的极限
int b=2147483646;
//测试用------------------------------
/*
//正负极限测试
int a=-2147483648;//此测试数已达int类型负数部分的极限
int b=2147483647;//此测试数已达int类型正数部分的极限
*/
/*
//负数限测试
int a=-2147483648;//此测试数已达int类型负数部分的极限
int b=-2147483647;//
*/
System.out.println("原来的a—— "+a);
System.out.println("原来的b—— "+b);
//两数交换过程
if (a>b)
{
a=a-b;
b=b+a;
a=b-a;
} else {
b=b-a;
a=a+b;
b=a-b;
}
System.out.println("——————————————");
System.out.println("交换后的a—— "+a);
System.out.println("交换后的b—— "+b);
}
}
复制代码
作者:
ixiangfeng
时间:
2013-10-31 22:27
星星点灯 发表于 2013-10-31 16:04
可以尝试以下方法
你这样做的确可以的 而且想法不错 但是还是没有解答我的问题吧? 我就是想问 两数相加之和都溢出了却还能完成交换?
作者:
忄雾飞扬
时间:
2013-10-31 23:22
int a=2147483647;
int b=46;
System.out.println("原来的a—— "+a);
System.out.println("原来的b—— "+b);
System.out.println("——————————————");
a=a+b;
System.out.println(a);
System.out.println(b);
b=a-b;
System.out.println(a);
System.out.println(b);
a=a-b;
System.out.println("——————————————");
System.out.println("交换后的a—— "+a);
System.out.println("交换后的b—— "+b);
朋友,我利用楼上哥们的代码,加了两句输出语句,打出值 看了下,我这样认为
你想,int最大正数是MAX 和最小负数是有一个区间的,如果,两个int数相加超最大正数后,溢出二进制首位0变1,为负数,
而下步你又用这个溢出的负数和b相减,又再次溢出int 的最小负数,二进制首位又从1变为了0.所以就出现了你说的值交换成功,
我总结的不太好,但就是这个意思,你再根据我说的话推理下,想想,应该就是这个原因 了,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2