黑马程序员技术交流社区

标题: 不用比较运算符,判断int型的a,b两数的大小. [打印本页]

作者: 何伟    时间: 2013-2-25 20:30
标题: 不用比较运算符,判断int型的a,b两数的大小.
本帖最后由 何伟 于 2013-2-25 20:39 编辑

复制代码
今天看到的代码谁给解释下?
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
  1. public class Test {  
  2.   public static void main(String[] args) {  
  3.     int a = 1;  
  4.     int b = 2;  
  5.     String[] buf = { "a=>b", "a < b" };  
  6.     int id1 = (a - b) >>> 31;  
  7.     System.out.println(id1); // 1  
  8.     System.out.println(buf[id1]); // a < b  
  9.   }  
  10. }  
  11. 今天看到的代码谁给说下原理?
复制代码

作者: 何伟    时间: 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,如果是非 ...

都是大神
作者: 黑马刘杰    时间: 2013-2-25 21:00
本帖最后由 黑马刘杰 于 2013-2-25 21:03 编辑

数据在计算机中是以补码形式存在的,补码的第一位为符号位,1表示为负,如:1111  1111  1111  1111  1111  1111  1111  1111就是-1的补码形式,0表示正,例如:0000  0000  0000  0000  0000  0000  0000  0001就是正数1

计算机中右移高位补符号位,左移低位补0.

当右移31位时, 如果是负数,就会变成1111  1111  1111  1111  1111  1111  1111  1111 即-1;如果是正数,就会变成0000  0000  0000  0000  0000  0000  0000  0000 即0.

字符串数组 String[] buf = { "a=>b", "a < b" };  中,0,1角标对应a和b的字符串形式的大小
作者: 黄玉昆    时间: 2013-2-25 22:26
朱玉玺 发表于 2013-2-25 20:45
int id1 = (a - b) >>> 31;关键是这句,a-b的结果肯定为一个值,如果是负数,那么id1的最高位为1,如果是非 ...

解释的不错,赞一个
作者: 朱玉玺    时间: 2013-2-25 23:44
黄玉昆 发表于 2013-2-25 22:26
解释的不错,赞一个

哈哈,多谢打赏:lol
作者: 黄玉昆    时间: 2013-2-26 07:34
朱玉玺 发表于 2013-2-25 23:44
哈哈,多谢打赏

嘿嘿,小意思
作者: 杨明明    时间: 2013-2-26 08:06
黑马刘杰 发表于 2013-2-25 21:00
数据在计算机中是以补码形式存在的,补码的第一位为符号位,1表示为负,如:1111  1111  1111  1111  1111  ...

负数最高位(即符号位)是1,无符号右移31位,空位补零,就变成1了;正数符号位(即最高位)为0,无符号右移31为,空位补零,结果就是0。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2