今天看到的代码谁给解释下?
public class Test { public static void main(String[] args) {
int a = 1;
int b = 2;
String[] buf = { "a=>b", "a < b" };
int id1 = (a - b) >>> 31;
System.out.println(id1); // 1
System.out.println(buf[id1]); // a < b
}
} 作者: 黑马刘杰 时间: 2013-2-25 20:36
代码呢?作者: 何伟 时间: 2013-2-25 20:37
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 2;
String[] buf = { "a=>b", "a < b" };
int id1 = (a - b) >>> 31;
System.out.println(id1); // 1
System.out.println(buf[id1]); // a < b
}
}
今天看到的代码谁给说下原理?
复制代码
作者: 何伟 时间: 2013-2-25 20:40
黑马刘杰 发表于 2013-2-25 20:36
代码呢?
代码贴了,刚开始没贴好:L作者: 宋蓬勃 时间: 2013-2-25 20:45
(a - b)>>>31
无符号右移31位,得到(a-b)的最高位,就是为了得到(a-b)是正数还是负数。
这里a<b,所以最高位是1,所以id1=1;作者: 朱玉玺 时间: 2013-2-25 20:45
int id1 = (a - b) >>> 31;关键是这句,a-b的结果肯定为一个值,如果是负数,那么id1的最高位为1,如果是非负数那么它的最高值为为0,而(a-b)>>>31,就是无符号右移31位,缺的位补的都是0,最终的结果就是取出id1最高的值,如果是0,那么a>=b,如果是1,那么a<b。它这里边比较巧妙的一点,是把id1的最高位的值作为数组的角标,然后关联要打印的字符串结果。作者: 何伟 时间: 2013-2-25 20:57
宋蓬勃 发表于 2013-2-25 20:45
(a - b)>>>31
无符号右移31位,得到(a-b)的最高位,就是为了得到(a-b)是正数还是负数。
好像懂了,谢谢啊作者: 何伟 时间: 2013-2-25 20:57
朱玉玺 发表于 2013-2-25 20:45
int id1 = (a - b) >>> 31;关键是这句,a-b的结果肯定为一个值,如果是负数,那么id1的最高位为1,如果是非 ...