看到一个面试题,大家来讨论下!解决方案

看到一个面试题,大家来讨论下!原帖见:今天去迅雷面试了,非常不爽题目是:不用比较运算符,判断int型的a,b两

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

题目是:不用比较运算符,判断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("-")){



System.out.println("a小于b");
}
System.out.println("a大于b");

}
//b不等于0
if(!String.valueOf(b).equals("0")){
c = a/b;
 
switch (c) {

case 0:
//a,b 都为正
if(!String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//a 为负,b为负
if(String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
//a 为负,b为正
if(String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//b 为负,a为正
if(!String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
break;
case 1:
//a/b=1的情况有a>b(a/b=1.32...)存在
//a 为负,b为正
if(String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//b 为负,a为正
if(!String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}

if(String.valueOf(a).equals(String.valueOf(b))){
System.out.println("a等于b");
}

else{
System.out.println("a大于b");
}

break;
default:
//a 为负,b为负
if(String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//a 为负,b为正
if(String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//b 为负,a为正
if(!String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
else{
System.out.println("a大于b");
}
}
}



}
[解决办法]
变态题目!直接来个true/false算了
[解决办法]
int max(int a, int b) {
return a+b;
}
不过感觉还是会有像LZ说的越界问题
[解决办法]
mark!!~~

[解决办法]
顶起来
[解决办法]

引用楼主 justinavril 的帖子:
原帖见:今天去迅雷面试了,非常不爽

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


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


Java codeSystem.out.println((((a >>> 31 =…

[解决办法]
Java code
用异常应该可以如下:(效率可能很低,不过觉得结果还是可以的)public class Test{    public static void main(String[] args)    {        int a=1,b=2;        Test test=new Test();        test.my_Compare(a,b);    }    public void my_Compare(int a,int b)    {        int aa=10,bb=10;        while(true)        {            try            {                a=a++;                aa=aa/a;                System.out.println("a="+a);            }            catch(Exception e)            {                System.out.println("a 大");                System.exit(0);            }            try            {                b=b++;                bb=bb/b;                System.out.println("b="+b);            }            catch(Exception e)            {                System.out.println("b 大");                System.exit(0);            }        }    }} 


[解决办法]
基于大家的讨论,我提出个方法

Java code
boolean[] judge = {true,false};        if(judge[-(int) (((long)a-(long)b)>>63)])    System.out.println("a is the bigger one");else    System.out.println("b is the bigger one");
[解决办法]
b==0?(a>0?1:0):(b>0?a/b:b/a)
[解决办法]
public void compare(Integer x,Integer y){
String [][]buf={{"=","="},{">","<"}}; 
int id1=((x-y)^(y-x))>>31;
id1=id1*id1;
int id2=(x/2-y/2)>>>31;
System.out.println(x+buf[id1][id2]+y);
}

这个应该可以吧~~
[解决办法]
?????怎么没出来呢??
在发一遍

public void compare(Integer x,Integer y){
String [][]buf={{"=","="},{">","<"}}; 
int id1=((x-y)^(y-x))>>31;
id1=id1*id1;
int id2=(x/2-y/2)>>>31;
System.out.println(x+buf[id1][id2]+y);
}

可以的话要给分啊,呵呵~
[解决办法]
max(a,b)=(a+b+abs(a-b))/2
min(a,b)=(a+b-abs(a-b))/2

[解决办法]
小弟想了个方法,不知道对不对,请纠正
1判断a和b是否相等if(a==b) 结束;else 进入2中;
2判断a和b的符号是否相同?
if((a^b)>>31) System.out.print("a和b是同号的");
else a和b异号
3当 a和b异号 的时候
if(a>>31) System.out.print("a大于b");
else System.out.print("b大于a");

4当 a和b同号的时候
(1).if(a>>31) System.out.print("a和b是非负的");
int c=a-a&b;
int d=b-a&b;

for(int k=1;k<=32;k++)
{
if(c>>k) {System.out.print("a大于b");break;}
if(d>>k) {System.out.print("b大于a");break;}
}

(2).else 
{
int x=~a;
int y=~b;
调用 4(1),当x大于y,a小于b,当y大于x时,a大于b;



[解决办法]
能解决问题还要简单的,就是答案了,丫迅雷好雷人的题目!
[解决办法]
//这个方法,x是0的情况不能处理,希望高手解决
int max(int x, int y){
int[] buf = {x, y};
return buf[y/x];
}
[解决办法]
菜鸟路过,期待达人
[解决办法]
判断(long)a - b行不
[解决办法]
int[] intArray = new int[2] ;

intArray[0] = a ;
intArray[1] = b ;

int index = (a - b) >>> 31 ;

intArray[index] 就是那个最大的值
[解决办法]
探讨
//这个方法,x是0的情况不能处理,希望高手解决
int max(int x, int y){
  int[] buf = {x, y};
  return buf[y/x];
}

[解决办法]
int a=2,b=3;

a = a-b;
a = a>>31;
if(a)
printf("a<b \n");
else
printf("a>=b\n");

------解决方案--------------------


探讨
public String compare(Integer x,Integer y){
  String [] buf={"=>"," <"};
  int id1=(x-y)>>>31; 
  System.out.println(id1);
  return buf[id1];
}

[解决办法]
7 int main()
8 {
9 int a=2, b=3;
 10 int c;
 11
 12 c = a-b;
 13 c = c>>31;
 14 if(c)
 15 printf("a<b \n");
 16 else{ 
 17 c = b-a;
 18 c = c>>31;
 19 if(c)
 20 printf("a>b\n");
 21 else
 22 printf("a==b\n");
 23 }
 24 
 25 return 0;
 26 }

[解决办法]
探讨
http://heisetoufa.javaeye.com/blog/227687
这里有答案

[解决办法]
c++实现
/*
返回值:
>0 x > y
0 x == y
<0 x < y
*/
int compare(int x, int y)
{
int tmp = x - y;
if ( (x >> 31) ^ (y >> 31))
{

if ((x >> 31) ^ (tmp >> 31))
{
return ~tmp;

else
{
return tmp;
}

else
{
return tmp;
}
}
[解决办法]
雷人 我想到的解决方法是复杂的菜鸟在这里学习了

ding 
http://heisetoufa.javaeye.com/blog/227687

Java code
    public static void main(String[] args) {        compareTwoInt(0, 0);        compareTwoInt(-12, -11);        compareTwoInt(-12, 0);        compareTwoInt(0, 0);        compareTwoInt(2, 2);        compareTwoInt(-12, -12);        compareTwoInt(-2, 3);        compareTwoInt(3, -3);        compareTwoInt(3, -2);        compare(1,0);        } /**     * 判断正负 true>0     *      * @param a     * @return     */    public static boolean parserInt(int a) {        switch (a >>> 31) {        case 0:            return true;        case 1:            return false;        default:            return false;        }    }    /**     * 判断是否为0     *      * @param a     *      */    public static boolean parserIntZero(int a) {        switch (a) {        case 0:            return true;        default:            return false;        }    }    public static void compareTwoInt(int a, int b) {        int c = 0;        // 此处最好采用正则表达来判断a b 的类型0 ,正,负;为了方便我就将就下了,-我也采用了equalsji        // 建议用正则表达        if (parserIntZero(a) && parserIntZero(b)) {            System.out.println("a等于b");        }        if (!parserIntZero(a) && parserIntZero(b)) {            if (!parserInt(a)) {                System.out.println("a小于b");            }else{                System.out.println("a大于b");            }                    }                // b不等于0        if (!parserIntZero(b)) {          c=a/b;            switch (c) {            case 0:                // a,b 都为正                if (parserInt(a) && parserInt(b)) {                    System.out.println("a小于b");                }                // a 为负,b为负                if (!parserInt(a) && !parserInt(b)) {                    System.out.println("a大于b");                }                // a 为负,b为正                if (!parserInt(a) && parserInt(b)) {                    System.out.println("a小于b");                }                // b 为负,a为正                if (parserInt(a) && !parserInt(b)) {                    System.out.println("a大于b");                }                break;            case 1:                // a 为负,b为正                if (!parserInt(a) && parserInt(b)) {                    System.out.println("a小于b");                }                // b 为负,a为正                if (parserInt(a) && !parserInt(b)) {                    System.out.println("a大于b");                }                // a/b=1的情况有a>b(a/b=1.32...)存在                else {                    // 获得余数                    int m = a % b;                    switch (m) {                    case 0:                        System.out.println("a等于b");break;                    default:                        // a 为负,b为负                        if (!parserInt(a) && !parserInt(b)) {                            System.out.println("a小于b");                        }                        // a,b 都为正                        if (parserInt(a) && parserInt(b)) {                            System.out.println("a大于b");                        }                        break;                    }                }                break;            default:                // a 为负,b为负                if (!parserInt(a) && !parserInt(b)) {                    System.out.println("a小于b");                }                // a 为负,b为正                if (!parserInt(a) && parserInt(b)) {                    System.out.println("a小于b");                }                // b 为负,a为正                if (parserInt(a) && !parserInt(b)) {                    System.out.println("a大于b");                } else {                    System.out.println("a大于b");                }            }        }    } 


[解决办法]
18正确吧
[解决办法]
刚看到题目,我也是想用减法,判断有无借位,看样考虑不周,学习学习!

[解决办法]
好,顶!
[解决办法]
帮顶。。。
[解决办法]
顶一下,我觉得77#的tz应该不错,推荐一下,应为位移运算不算比较运算符、……
[解决办法]
看看,学习学习~~~
[解决办法]
我是一个新手学java才半年了我觉的你们都好麻烦哦
把他们放在数组里面一个排序Array.sort不就好了嘛

[解决办法]
顶了