上周,在Sun的Java论坛上出现了一个这样的帖子,这个贴子的链接如下:
LZ的贴子翻译如下:
大家好,我是一个Java的新手,我有一个简单的问题:请问我怎么才能反转一个整数的符号啊。比如把-12转成+12。是的,毫无疑问这是个简单的问题,但我弄了一整天我也找不到什么好的方法。非常感谢如果你能告诉我Java有什么方法可以做到这个事,或者告诉我一个正确的方向——比如使用一些数学库或是二进制方法什么的。谢谢!
这个贴子的沙发给出了答案:
n = -n;
LZ在四楼回复到:
我知道是个很简单的事,可我没有想到居然这么简单,我觉得你可能是对的。谢谢你。
过了一会,又回复到:
不开玩笑地说,我试了,真的没有问题耶!
看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习。
这本是一个平淡无奇的贴子,不过回复中那些恶搞的“解决方案”太强大了,在这里例举一下吧。
贴子的板凳给出了这样的答案(这是恶搞的开始)
1 2 3 4 5 6 7 8 9 10 | int x = numberToInvertSign; boolean pos = x > 0 ; for ( int i = 0 ; i < 2 *Math.abs(x); i++){ if (pos){ numberToInvertSign--; } else { numberToInvertSign++; } } |
然后,有人说,n = -n 可以是可以,但不够晦涩,于是一个晦涩的解决方案出现了:
1 2 | int n = ....; n = ( 0xffffffff ^ n) + 1 ; |
然后,又出现了一些看似简单,其实是比较晦涩的方案
1 | <code>n = ~n + 1 ; </code> |
1 | <code><code>n = ~--n; </code></code> |
继续,有才的人从来就不少:
1 2 3 4 5 6 7 | <code><code>n^= 0xffffffff ; int m; for (m= 1 ; m != 0 && ((n&m) != 0 ); m<<= 1 ); n|= m; if (m == 0 ) n= m; else for (m >>= 1 ; m != 0 ; n^= m, m>>= 1 ); </code></code> |
呵呵,开始越来越强大了,我以前也向大家介绍过《》的文章,和这些恶搞的人可能有点相似吧。上面这个例子一出,大家都在讨论上面例子中的for循环语句,呵呵,很费解啊。
然后,后面几个就开始乱来了:
1 2 3 | public int invert( int i) { return i - (i + i); } |
1 2 3 4 5 6 7 | switch (i) { case 1 : return - 1 ; case 2 : return - 2 ; case 3 : return - 3 ; // ... etc, you get the proper pattern } |
不过事情还没有结束,看看下面这个吧,OMG。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int absoluteValue( int num) { int max = 0 ; for ( int i = 0 ; true ; ++i) { max = i > max ? i : max; if (i == num) { if (i >= max) return i; return -i; } } } |
还有用字符串的解决方案:
1 2 3 4 5 6 7 8 9 10 11 | public int invert( int n) { String nStr = String.valueOf(n); if (nStr.startsWith( "-" )) { nStr = nStr.replace( "-" , "" ); } else { nStr = "-" + nStr; } return Integer.parseInt(nStr); } |
别忘了面象对象,有最新Java支持的模板库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | public interface Negatable<T extends Number> { T value(); T negate(); } public abstract class NegatableInteger implements Negatable<Integer> { private final int value; protected NegatableInteger( int value) { this .value = value; } public static NegatableInteger createNegatableInteger( int value) { if (value > 0 ) { return new NegatablePositiveInteger(value); } else if (value == Integer.MIN_VALUE) { throw new IllegalArgumentException( "cannot negate " + value); } else if (value < 0 ) { return new NegatableNegativeInteger(value); } else { return new NegatableZeroInteger(value); } } public Integer value() { return value; } public Integer negate() { String negatedString = negateValueAsString (); Integer negatedInteger = Integer.parseInt(negatedString); return negatedInteger; } protected abstract String negateValueAsString (); } public class NegatablePositiveInteger extends NegatableInteger { public NegatablePositiveInteger( int value) { super (value); } protected String negateValueAsString () { String valueAsString = String.valueOf (value()); return "-" + valueAsString; } } public class NegatableNegativeInteger extends NegatableInteger { public NegatableNegativeInteger ( int value) { super (value); } protected String negateValueAsString () { String valueAsString = String.valueOf (value()); return valueAsString.substring( 1 ); } } public class NegatableZeroInteger extends NegatableInteger { public NegatableZeroInteger ( int value) { super (value); } protected String negateValueAsString () { return String.valueOf (value()); } } |
这个贴子基本上就是两页,好像不算太严重,如果你这样想的话,你就大错特错了。这个贴子被人转到了reddit.com,于是一发不可收拾,在上面的回贴达到了490多条。链接如下:
有人说,要用try catch;有人说要使用XML配置文件……,程序员们在追逐更为变态和疯狂的东西,并从中找到快乐,呵呵。
看完后,正如reddit.com所说——“编程好难啊”!
无独有偶,这并不是第一次,也不会是最后一次,让我们看看在PHP的官网上发生的类似的一幕——讨论PHP的abs取绝对值函数的函数说明文档中的回复:
又是一个长贴,还带着很多性能分析,真的很好很强大!
(全文完)