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