• 编程真难啊


    编程真难啊

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

    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>

    呵呵,开始越来越强大了,我以前也向大家介绍过《如何加密/弄乱C源代码》的文章,和这些恶搞的人可能有点相似吧。上面这个例子一出,大家都在讨论上面例子中的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多条。链接如下:

    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

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

    (全文完)

  • 相关阅读:
    omnibus gitlab-ce安装
    Helm
    pod状态为Back-off
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    云主机搭建Kubernetes 1.10集群
    Linux清除Windows密码
    Nginx负载均衡之健康检查
    MariaDB主从复制搭建
    Python基础
    Tomcat URL重写
  • 原文地址:https://www.cnblogs.com/yymn/p/4647316.html
Copyright © 2020-2023  润新知