編程真難啊

上周,在Sun的Java論壇上出現了一個這樣的帖子,這個貼子的鏈接如下:
http://forums.sun.com/thread.jspa?threadID=5404590&start=0&tstart=0

LZ的貼子翻譯如下:

大家好,我是一個Java的新手,我有一個簡單的問題:請問我怎么才能反轉一個整數的符號啊。比如把-12轉成+12。是的,毫無疑問這是個簡單的問題,但我弄了一整天我也找不到什么好的方法。非常感謝如果你能告訴我Java有什么方法可以做到這個事,或者告訴我一個正確的方向——比如使用一些數學庫或是二進制方法什么的。謝謝!

這個貼子的沙發給出了答案:

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;

然后,又出現了一些看似簡單,其實是比較晦澀的方案  

<code>n = ~n + 1; </code>
<code><code>n = ~--n; </code></code>

繼續,有才的人從來就不少: 

<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循環語句,呵呵,很費解啊。

然后,后面幾個就開始亂來了:

public int invert(int i) {
  return i - (i + i);
}
switch (i)
{
  case 1: return -1;
  case 2: return -2;
  case 3: return -3;
  // ... etc, you get the proper pattern
}

不過事情還沒有結束,看看下面這個吧,OMG。 

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;
  }
 }
}

還有用字符串的解決方案:

public int invert(int n) {
    String nStr = String.valueOf(n);
  
    if (nStr.startsWith("-")) {
        nStr = nStr.replace("-", "");
    } else {
        nStr = "-" + nStr;
    }
  
    return Integer.parseInt(nStr);
}

別忘了面象對象,有最新Java支持的模板庫: 

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

又是一個長貼,還帶著很多性能分析,真的很好很強大!

轉自:http://coolshell.cn/articles/1391.html

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2426

(0)
s19930811s19930811
上一篇 2015-04-03
下一篇 2015-04-03

相關推薦

  • 筆記–8.4 文本處理工具,正則表達式

    cat 查看文本文件 命令功能: cat主要有三大功能: 1.一次顯示整個文件:cat filename 2.從鍵盤創建一個文件:cat > filename 只能創建新文件,不能編輯已有文件. 3.將幾個文件合并為一個文件:cat file1 file2 > fil…

    Linux干貨 2016-08-07
  • CentOS7 實現網卡綁定

    Bonding ;理念 將多塊網卡綁定同一IP地址對外提供服務,可以實現高可用 或者負載均衡。直接給兩塊網卡設置同一IP地址是不可以的 。通過bonding,虛擬一塊網卡對外提供連接,物理網卡的 被修改為相同的MAC地址 banding工作模式 Mode 0 (balance-rr) 輪轉(Round-robin)策略: 從頭到尾順序的在每一個slave 接…

    2017-12-19
  • 查找、壓縮 隨記

     查找模塊 1. locate : 非實時查找(數據庫查找)     實時查找: find locate 查詢是建立在系統上預建的文件索引數據庫 /var/lib/mlocate/mlocate.db 索引的構建是在系統較為空閑時自動進行(周期性任務); 管理員手動更新數據庫(updatedb) 索引構建過程需要遍歷整個根文件系…

    Linux干貨 2016-08-15
  • Linux文件根目錄

    / 表示為根目錄/├── bin  存放用戶使用的基本命令(可執行程序,二進制文件)  不能單獨分區├── boot   跟內核有關的文件 grub  內核和BootLoader ├── cgroup   用來資源限制資源隔離 docker 容器化├── dev(device )設備文件&…

    2017-03-27
  • 文件系統磁盤管理上

    磁盤:主要作用用于存儲數據 早期一塊硬盤共有256個盤面,每個盤面有1024個磁道,每個磁道有63個扇區,每個扇區的大小是512byte 硬盤的命名: 早期IDE硬盤標記為hd scsi、usb、sas標記為sd 引用設備的方式 設備文件名 標卷 UUID 硬盤分區: 第0個磁道的第0個扇區存放的是磁盤的信息 MBR:Master Boot Record 主…

    Linux干貨 2016-08-30
  • Linux基礎知識之cp mv rm

    該博文以CentOS6.8_x86_64系統為基礎,Xshell 5遠程連接CentOS系統,以root身份登錄系統和sjsir普通用戶身份登錄系統。 為什么要學習cp、mv、rm命令?     cp、mv、rm命令為Linux系統使用最長使用的三個命令之一,復制、移動和刪除是我們平時處理一些文件必須要學會的命令,應該用于熟練掌握和使用的…

    Linux干貨 2016-07-29
欧美性久久久久