关于整形(int)不使用中间变量相信大家有常用的算法,比如
1最常用的:
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a^b;
b = b^a;
a = a^b;
System.out.print(a + ":" + b);
}
这个是最快的其次不是很好但是可行的
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a+b;
b = a-b;
a = a-b;
System.out.print(a + ":" + b);
}和
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a * b;
b = a / b;
a = a / b;
System.out.print(a + ":" + b);
}
这2种可能会内存溢出,不建议使用最后一种,可能大家没看过的,可能是最难理解的:
public static void main(String[] args) {
int a = 5;
int b = 4;
b = a + 0 * (a = b);
System.out.print(a + ":" + b);
}
1最常用的:
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a^b;
b = b^a;
a = a^b;
System.out.print(a + ":" + b);
}
这个是最快的其次不是很好但是可行的
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a+b;
b = a-b;
a = a-b;
System.out.print(a + ":" + b);
}和
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a * b;
b = a / b;
a = a / b;
System.out.print(a + ":" + b);
}
这2种可能会内存溢出,不建议使用最后一种,可能大家没看过的,可能是最难理解的:
public static void main(String[] args) {
int a = 5;
int b = 4;
b = a + 0 * (a = b);
System.out.print(a + ":" + b);
}
解决方案 »
- java的一个问题
- java.lang.NumberFormatException: multiple points。请问这个问题怎么解决?
- 在eclipse3.0中如何改变xml和jsp的字体。
- UP有分!UP有分!UP有分!!!!!!!!大家各抒己见:JAVA的未来!!!!!UP有分!UP有分!UP有分!!
- 请教,在jbuilder中的两个窗口的关闭问题?谢谢
- 高分请教,如何用JAVA实现浏览局域网里的其他机子的目录。在线等待
- javax.naming.NoInitialContextException求解
- 什么叫上溯造型?给个例子!
- 关于线程问题,请指教,谢谢了
- 请问谁做过ftp协议?
- 怎样将字符窜输入到特定txt文件中?
- 两个日期怎么求他们的差?
http://topic.csdn.net/u/20070929/13/97529154-be2f-431e-a2bd-d7ccd048cf77.html
差不多吧?
但是用C#试了一下,结果大吃一惊,交换了.奇怪,又用C++试了一下,没有交换..
毕竟对错不能按编译器说的算吧,逻辑上应该没交换就是没交换,你交换了,不管你是谁都是错的....
public class Test {
public static void main(String[] args) {
int a = 5;
int b = 4;
b = a - b + (a=b);
System.out.println(a + ":" + b);//4:5
int c = 5;
int d = 4;
d = (c=d) + c - d;
System.out.println(c + ":" + d);//4:4
}
}运行顺序,从左到右先赋值计算。
最后一种依赖于编译器,不同编译器结果未必一样(当然java里可能都一样),其实相当于内部使用了临时变量
int a = 5;
int b = 4;
b = a + 0 * (a = b);
System.out.print(a + ":" + b);
}这种算法很犀利啊
4 = 5 + 0 *(5 = 4); 结果为5 小括号内地结果为4
b = a + 0 * (a = b) ; b=5 a=b即a=4
^这个符号是干吗的?
b = 0 * (a = b) + a;
按照你的写法这个就等于
b = 0 + a;但是结果却会大不相同。
底层的编译不是这么简单的(针对java,C有些编译这个算法失败)
我只能这样理解了,不管怎样按照优先级,肯定是先运行(a=b),所以说如果a在前,那么a还是老a,如果a在后的话,那就是新赋值后的a。至于你说的底层是如何编译的,不得而知了,期待大牛通过内存分析的办法来解释下这个编译过程了。
p = 1;
p = p++;
System.out.println(p);
0: iconst_5 //栈(底-->顶):5
1: istore_1 //5存进变量1
2: iconst_4 //栈(底-->顶):4
3: istore_2 //4存进变量2
4: iload_1 //5拿到顶 栈(底-->顶):5
5: iconst_0 //0入栈 栈(底-->顶):5 0
6: iload_2 //4拿到顶 栈(底-->顶):5 0 4
7: dup //复制栈顶元素,入栈 栈(底-->顶):5 0 4 4
8: istore_1 //4存进变量1,到这完成一半了,变量1由5变成4。 栈(底-->顶):5 0 4
9: imul //栈顶两元素做积,入栈 栈(底-->顶):5 0
10: iadd //栈顶两元素做和,入栈 栈(底-->顶):5
11: istore_2 //5存变量2中
12: return
b = 0 * (a = b)+a ;
两者的区别在于:前者先把a的值读入操作栈,用于后来的相加操作,期间修改了a变量的值,却没参与运算
后者就是先修改了a变量的值,做了积之后再从a变量读入数值,进行加法操作。
b = a + 0 * (a = b);
果断抓去当典型批斗!
第二种第三中如果是在oj作题,估计都得wa。a+b a*b像你说的都得溢出。
第三种我认为不是很正确,和编译器有关。就像a=1. b=a+(++a);b不一定等于3吧。
b = a + 0 * (a = b);
没有一个语言规定b必须在a=b之前求值呀
如果编译器优化的时候改变求值顺序,结果就变了
如
a=b;
b=a+0*a;
这样就不对了
顺便问一个算法题,假设有个链表,(vector,map,array等),里面有几百万条记录,每记录是一个class对象,其中有一个变量是int. 假设已知某记录的该变量的值,var=1024. 用什么方法能快速找出这条记录,算法复杂度大约是多少?
说真的,讨论这些就是浪费时间,交换变量就可以用个中间变量,不会耽误多少时间(现在的电脑还是能够承担起的,要是怕开销太大,干脆你以后就只用C/C++吧,其他语言本身开销很大),建议新手别看这种无聊贴,浪费时间,把时间放在语言的精髓。(还有要说的就是,上面有些人学的什么编程啊,还见都没见过,连个16的人都比不过,说实话,我只16岁)