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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何伟 于 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  
  }  
}  

12 个回复

倒序浏览
代码呢?
回复 使用道具 举报
  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:36
代码呢?

代码贴了,刚开始没贴好:L
回复 使用道具 举报
(a - b)>>>31
无符号右移31位,得到(a-b)的最高位,就是为了得到(a-b)是正数还是负数。


这里a<b,所以最高位是1,所以id1=1;
回复 使用道具 举报
int id1 = (a - b) >>> 31;关键是这句,a-b的结果肯定为一个值,如果是负数,那么id1的最高位为1,如果是非负数那么它的最高值为为0,而(a-b)>>>31,就是无符号右移31位,缺的位补的都是0,最终的结果就是取出id1最高的值,如果是0,那么a>=b,如果是1,那么a<b。它这里边比较巧妙的一点,是把id1的最高位的值作为数组的角标,然后关联要打印的字符串结果。

评分

参与人数 1黑马币 +3 收起 理由
黄玉昆 + 3 赞一个!

查看全部评分

回复 使用道具 举报
何伟 中级黑马 2013-2-25 20:57:21
7#
宋蓬勃 发表于 2013-2-25 20:45
(a - b)>>>31
无符号右移31位,得到(a-b)的最高位,就是为了得到(a-b)是正数还是负数。

好像懂了,谢谢啊
回复 使用道具 举报
何伟 中级黑马 2013-2-25 20:57:31
8#
朱玉玺 发表于 2013-2-25 20:45
int id1 = (a - b) >>> 31;关键是这句,a-b的结果肯定为一个值,如果是负数,那么id1的最高位为1,如果是非 ...

都是大神
回复 使用道具 举报
本帖最后由 黑马刘杰 于 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 20:45
int id1 = (a - b) >>> 31;关键是这句,a-b的结果肯定为一个值,如果是负数,那么id1的最高位为1,如果是非 ...

解释的不错,赞一个
回复 使用道具 举报
黄玉昆 发表于 2013-2-25 22:26
解释的不错,赞一个

哈哈,多谢打赏:lol
回复 使用道具 举报
朱玉玺 发表于 2013-2-25 23:44
哈哈,多谢打赏

嘿嘿,小意思
回复 使用道具 举报
黑马刘杰 发表于 2013-2-25 21:00
数据在计算机中是以补码形式存在的,补码的第一位为符号位,1表示为负,如:1111  1111  1111  1111  1111  ...

负数最高位(即符号位)是1,无符号右移31位,空位补零,就变成1了;正数符号位(即最高位)为0,无符号右移31为,空位补零,结果就是0。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马