编程,是一件真的不容易的事情(原题:编程真难呀)

 

原文地址是:http://coolshell.cn/?p=1391  

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

上周,在Sun的Java论坛上出现了一个这样的帖子,这个贴子的链接如下:
http://forums.sun.com/thread.jspa?threadID=5404590&start=0&tstart=0

LZ的贴子翻译如下:

大家好,我是一个Java的新手,我有一个简单的问题:请问我怎么才能反转一个整数的符号啊。比如把-12转成+12。是 的,毫无疑问这是个简单的问题,但我弄了一整天我也找不到什么好的方法。非常感谢如果你能告诉我Java有什么方法可以做到这个事,或者告诉我一个正确的 方向——比如使用一些数学库或是二进制方法什么的。谢谢!

这个贴子的沙发给出了答案:

n = -n;

LZ在四楼回复到:

我知道是个很简单的事,可我没有想到居然这么简单,我觉得你可能是对的。谢谢你。

过了一会,又回复到:

不开玩笑地说,我试了,真的没有问题耶!

看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习

这本是一个平淡无奇的贴子,不过回复中那些恶搞的“解决方案”太强大了,在这里例举一下吧。

贴子的板凳给出了这样的答案(这是恶搞的开始)

 

01.int x = numberToInvertSign;
02.boolean pos = x > 0;
03.for(int i = 0; i < 2*Math.abs(x); i++){
04.    if(pos){
05.        numberToInvertSign--;
06.    }
07.    else{
08.        numberToInvertSign++;
09.    }
10.}

然后,有人说,n = -n 可以是可以,但不够晦涩,于是一个晦涩的解决方案出现了:

1.int n = ....;
2. n = (0xffffffff ^ n) + 1;

然后,又出现了一些看似简单,其实是比较晦涩的方案

1.n = ~n + 1;

 

1.n = ~--n;

 

继续,有才的人从来就不少:

1.n^= 0xffffffff;
2.int m;
3.for (m= 1; m != 0 && ((n&m) != 0); m<<= 1);
4.n|= m;
5.if (m == 0) n= m;
6.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

又是一个长贴,还带着很多性能分析,真的很好很强大!

(全文完)

posted @ 2009-09-14 14:51  玉米疯收  阅读(1243)  评论(12编辑  收藏  举报