如何求一个int型数的绝对值?

leedone1989 2009-09-06 12:01:27
问题如题:

要求:

1、不得使用任何API,如Math.abs()等。
2、不得使用判断语句,如if、for、while、switch、?:等。
3、不得使用比较语句,如:==、<=、>=、!=、<、>等。

请看清要求。
...全文
3700 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
高光King 2011-08-22
  • 打赏
  • 举报
回复
如果 i 为负数 : i >> 31 结果 为 -1,-1 | 1 = -1, i * -1 结果为正i.
如果 i 为正数 : i >> 31 结果为 0, 0 | 1 = 1, i * 1 结果为正i.
如果 i 为0 : 结果肯定是0啦。

[Quote=引用 53 楼 gaogguang 的回复:]

i * (( i >> 31 ) | 1 )
[/Quote]
高光King 2011-08-22
  • 打赏
  • 举报
回复
i * (( i >> 31 ) | 1 )
gghaomm 2010-12-01
  • 打赏
  • 举报
回复
Math.abs() 怎么实现这个滴列?
不会是用了位运算吧?
  • 打赏
  • 举报
回复
都在整位运算么?如果看过 Hacker's Delight 这本书的话,可能会发觉原来根本就不懂位运算!
  • 打赏
  • 举报
回复
我认为纯粹就是吃饱了没事干

那些表达式,那些语句放在那里就是让大家用的。

又是移位,又是加减,又是乘除的,我不相信这样的效率会比 if 或者三目运算符快!
chinayuanao 2009-09-08
  • 打赏
  • 举报
回复

public class AbsCal {

public static void main(String[] args) {
for(int i=-10; i<10; i++)
System.out.println("abs("+i+") = "+abs(i));
}

public static int abs(int num) {
return ~num +1;
}

}
leedone1989 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 robyjeffding 的回复:]
引用 13 楼 java2000_net 的回复:
Java codepublicstaticint abs(int num) {return num* (1- ((num>>>31) < <1));
  }

这段代码,老紫竹能否解读一下?先谢谢了!
[/Quote]

28楼解释过了
leedone1989 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 closewbq 的回复:]
都说的差不多了,那换点别的。
Java codeint test=-9;
String str=String.valueOf(test);
str=str.startsWith("-")?str.split("-")[1]:str;
test=Integer.parseInt(str);
System.out.println(test);
[/Quote]

哈哈,不准用API哦
qinqinxiatiao 2009-09-08
  • 打赏
  • 举报
回复

public static int myabs(int num){
return (num < 0) ? -num : num;
}


只会这个... 汗..

Gere Yeung 2009-09-07
  • 打赏
  • 举报
回复
实在不懂。
24K純帥 2009-09-07
  • 打赏
  • 举报
回复
囧,我只知道Math.abs()这样绝对值,学习
dbsshida 2009-09-07
  • 打赏
  • 举报
回复
....
moneyNUMBER_1 2009-09-07
  • 打赏
  • 举报
回复
你干吗不用这个整型数是否大于0做为条件来做
longq121 2009-09-07
  • 打赏
  • 举报
回复
学习了。
  • 打赏
  • 举报
回复
mark
closewbq 2009-09-07
  • 打赏
  • 举报
回复
都说的差不多了,那换点别的。

int test=-9;
String str=String.valueOf(test);
str=str.startsWith("-")?str.split("-")[1]:str;
test=Integer.parseInt(str);
System.out.println(test);
robyjeffding 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 java2000_net 的回复:]
Java codepublicstaticint abs(int num) {return num* (1- ((num>>>31)<<1));
}
[/Quote]
这段代码,老紫竹能否解读一下?先谢谢了!
angel6709 2009-09-07
  • 打赏
  • 举报
回复
我靠,谁这么无聊啊。。。
d3623301984 2009-09-07
  • 打赏
  • 举报
回复
学习了,解释的很清楚!
[Quote=引用 28 楼 leedone1989 的回复:]
引用 19 楼 liu_liyang 的回复:
引用 13 楼 java2000_net 的回复:
Java codepublicstaticint abs(int num) {return num* (1- ((num>>>31) < <1));
  }

是啊,但是对于我这样的菜鸟看不懂这个东西,这么不连解释一起带上呢。这里就是为了学习啊。


我来解释一下吧:

num>>>31 得到的是num的符号位。num为负则num>>>31=0;否则num>>>31=1;

(num>>>31) < <1 相当于将 num>>>31 乘以2.

1- ((num>>>31) < <1) 的作用是将 ((num>>>31) < <1)由0变为1,或者由1变为-1;

经过1- ((num>>>31) < <1) 的变换后,如果Num为负,则表达式的结果为-1;否则为1。

num* (1- ((num>>>31) < <1))的意思也就明确了……
[/Quote]
knightzhuwei 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leedone1989 的回复:]
引用 2 楼 knightzhuwei 的回复:
int i=-2
i=i&0x7fffffff


比如这个方法,虽然还没来得及去验证,但是就我的知识范围内,它确实让我眼前亮了一下……
[/Quote]

我真丢人。。这个完全是不对的。。。
加载更多回复(34)

62,617

社区成员

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

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