日期:2014-05-20  浏览次数:20625 次

看到一个面试题,大家来讨论下!
原帖见:今天去迅雷面试了,非常不爽

题目是:不用比较运算符,判断int型的a,b两数的大小。


我当时想到的,就是a-b然后判断最高位是1还是0,但是最后发现如果a=-2147483648,b=2147483647时,作为int型的数相减就越界了,并且符号位丢失了。其实不用那么极端的例子,因为两个不同符号的数,相减很容易越界。所以我在之前先判断a和b的符号位。于是就有了下面的代码:

Java code
System.out.println((((a >>> 31 == 0) && (b >>> 31 == 1))|
(((a >>> 31)^(b >>> 31))==0)&&(((a-b)>>>31)==0))?"a>=b":"a<b");//同符号的相减;异号时a为正,则a>=b。


当然了,也可以32位逐位比较。我想听听大家的好意见。





Java code

public class Bigger { 
  public static void main(String args[]){
    int a = -2147483648; 
    int b = 2147483647; 
    String[] strArray = {"a>=b", "a<b"}; 
    int i = (int)((long)a-(long)b >>> 63);         System.out.println(strArray[i]); 
  }
} 





------解决方案--------------------
不用比较运算符, 就是说==号也不能用
(a >>> 31 == 0)
这里用到了等号

所以答案错误。只要是用到了if之类的,则必然要 true/false, 则必然涉及到比较运算符。

思考中...


------解决方案--------------------
不会啊 接分吧
------解决方案--------------------
不会 学习
------解决方案--------------------
引用楼主 justinavril 的帖子:
原帖见:今天去迅雷面试了,非常不爽

题目是:不用比较运算符,判断int型的a,b两数的大小。


我当时想到的,就是a-b然后判断最高位是1还是0,但是最后发现如果a=-2147483648,b=2147483647时,作为int型的数相减就越界了,并且符号位丢失了。其实不用那么极端的例子,因为两个不同符号的数,相减很容易越界。所以我在之前先判断a和b的符号位。于是就有了下面的代码:

Java codeSystem.out.println((((a>>>31==0)&&(b>…

------解决方案--------------------
可以用接口comparable来实现,只要实现它的方法compareTo()方法即可原理可以参考此接口的使用,我写了个例子,可以参考一下,结果是正确的。
Java code

public class Test1 implements Comparable<Integer>{

    
    private int a;
    
    
    public Test1(){
        
    }
    public Test1(int c){
        this.a=c;
        
    }
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i=new Test1(-2147483648).compareTo(2147483647);
    if(i>0){
        System.out.println("a>b");
    }else if(i<0){
        System.out.println("a<b");
    }else{
        System.out.println("a=b");
    }
        
    }
    public int compareTo(Integer i) {
        // TODO Auto-generated method stub
        if(a<i)
            return -1;
        if(a>i)
            return 1;
        return 0;
    }
    

}

------解决方案--------------------
我们方法是重写compareTo方法而已,很简单。
------解决方案--------------------
成就啊!---变态的问题解决了 一个> < ==都没有用到
判断的时候建议用下正则---为了速度我用了equals判断
public static void main(String[] args) {
compareTwoInt(23, -45);
}

public static void compareTwoInt(int a, int b){

int c = 0;
//此处最好采用正则表达来判断a b 的类型0 ,正,负;为了方便我就将就下了,-我也采用了equalsji
//建议用正则表达
if(String.valueOf(a).equals("0")&&String.valueOf(b).equals("0")){
System.out.println("a等于b");
}
if(!String.valueOf(a).equals("0")&&String.valueOf(b).equals("0")){
if(String.valueOf(a).contains("-")){