看到一个面试题,大家来讨论下!

justinavril 2009-04-29 04:32:34
加精
原帖见:今天去迅雷面试了,非常不爽

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


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

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位逐位比较。我想听听大家的好意见。






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]);
}
}


...全文
5630 286 打赏 收藏 转发到动态 举报
写回复
用AI写文章
286 条回复
切换为时间正序
请发表友善的回复…
发表回复
alidion 2010-06-25
  • 打赏
  • 举报
回复
a/2+b/2+abs(a/2-b/2) 正解
wangzhichao2303 2009-12-13
  • 打赏
  • 举报
回复
好难啊。。。。
yuanzh 2009-12-05
  • 打赏
  • 举报
回复
mark
siriuswong 2009-09-25
  • 打赏
  • 举报
回复
学习了
leedone1989 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 208 楼 heyinova 的回复:]
不用这么麻烦吧,利用int小数除大数等于0
int max(int a, int b)
        {
            return (a * (a / b) + b * (b / a)) / ((a / b) + (b / a));
        }
min的话反过来:
int max(int a, int b)
        {
            return (b * (a / b) + a * (b / a)) / ((a / b) + (b / a));
        }

[/Quote]

a或b为零的时候会出错。
leedone1989 2009-08-26
  • 打赏
  • 举报
回复

public class getMAX{
public static void main(String[] args)
{
int x=0,y=0;
/* 经过以下几组数据测试通过:请删除下列任意一组注释或自拟数据进行测试 */


// x=-2147483648 ;y=2147483647;
// x=-2147483648 ;y=-2147483647;
// x=2147483647 ;y=2147483647;
// x=100 ;y=0;
// x=100 ;y=-100;

int a=1-((x/2-y/2)>>>31); //x/2大于或等于y/2时为1,否则为0
int b=1/(Math.abs(x/2-y/2)+1); //x/2等于y/2时为1,否则为0
int c=x%2; //x/2的余数
int d=y%2; //y/2的余数

int max =x*(a-(1-c)*b)+y*(1-(a-(1-c)*b));

System.out.println("a="+a+";b="+b+";c="+c+";d="+d+";MAX="+max);
}
}


原创,谢谢大家;
msl2538 2009-08-24
  • 打赏
  • 举报
回复
顶起,难也难也
leedone1989 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 seaman_xh 的回复:]
//这个方法,x是0的情况不能处理,希望高手解决
int max(int x, int y){
  int[] buf = {x, y};
  return buf[y/x];
}
[/Quote]

X Y异号也不行滴
java1109 2009-08-23
  • 打赏
  • 举报
回复
mark
简单的工作室 2009-05-04
  • 打赏
  • 举报
回复
正在用迅雷下电影来着,哎,都往大公司跑,难道工资很高??。。。。
lincoln423 2009-05-04
  • 打赏
  • 举报
回复
谁会用单片机编写喇叭驱动啊?急
erp21com 2009-05-04
  • 打赏
  • 举报
回复
学习了
erp21com 2009-05-04
  • 打赏
  • 举报
回复
这个我感觉也是用按位运算来解比较好,可能考官也是这个意思,我们很多的人写软件,就是不太清楚底层的具体运算是什么,只知道是这么用。可以参考一下数字电路,里面就有比较器的实现方法,根本就不会用到比较运算符。
lincen529 2009-05-04
  • 打赏
  • 举报
回复
新手学习了 赶快保存一下备用
考拉007 2009-05-04
  • 打赏
  • 举报
回复
学习一下
手抓饼加辣 2009-05-04
  • 打赏
  • 举报
回复
难道大牛就是把简单的问题复杂化?学习,加倍地学习。
Walkman_玺 2009-05-04
  • 打赏
  • 举报
回复
太有难度了~学习
sonofthesea 2009-05-04
  • 打赏
  • 举报
回复
[Quote=引用 262 楼 sonofthesea 的回复:]
Java code
public class sort{
public static void main(String [] args)
{
int a=10,b=20;int [] ss=new int[200];
try{
ss[a-b]=1;
System.out.println("大于");
}catch(Exception e){
System.out.println("小于");
}

}
}

[/Quote]
刚学了几天java ,觉得这抛异常这东西挺好玩,不知道能不能解决这个题目
zhanghe086 2009-05-04
  • 打赏
  • 举报
回复
sf
newlhl198989 2009-05-04
  • 打赏
  • 举报
回复
用C写的代码,不知可以不

int a,b;
long c;
c=((long)a-b+abs((long)a-b))/2;/*c只能等于0,a或b*/
if(c)
printf("a大于b");
else
{
c=((long)b-a+abs((long)b-a))/2;
if(c)
printf("a小于b");
else
printf("a等于b");
}
加载更多回复(265)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧