編程真難啊
上周,在Sun的Java論壇上出現(xiàn)了一個(gè)這樣的帖子,這個(gè)貼子的鏈接如下:
http://forums.sun.com/thread.jspa?threadID=5404590&start=0&tstart=0
LZ的貼子翻譯如下:
大家好,我是一個(gè)Java的新手,我有一個(gè)簡單的問題:請(qǐng)問我怎么才能反轉(zhuǎn)一個(gè)整數(shù)的符號(hào)啊。比如把-12轉(zhuǎn)成+12。是的,毫無疑問這是個(gè)簡單的問題,但我弄了一整天我也找不到什么好的方法。非常感謝如果你能告訴我Java有什么方法可以做到這個(gè)事,或者告訴我一個(gè)正確的方向——比如使用一些數(shù)學(xué)庫或是二進(jìn)制方法什么的。謝謝!
這個(gè)貼子的沙發(fā)給出了答案:
n = -n;
LZ在四樓回復(fù)到:
我知道是個(gè)很簡單的事,可我沒有想到居然這么簡單,我覺得你可能是對(duì)的。謝謝你。
過了一會(huì),又回復(fù)到:
不開玩笑地說,我試了,真的沒有問題耶!
看到這樣的貼子,就能想到國內(nèi)論壇上很多這樣的“問弱智問題的貼子”,結(jié)果可能都會(huì)是比較慘!是的,國外的互聯(lián)網(wǎng)文化和國內(nèi)差不多,都是惡搞的人多于熱心的人,呵呵。不過,國外的網(wǎng)民們有一點(diǎn)是好的,再惡搞也是就事搞事,不會(huì)有侮辱人的語言,這點(diǎn)真是值國內(nèi)的人學(xué)習(xí)。
這本是一個(gè)平淡無奇的貼子,不過回復(fù)中那些惡搞的“解決方案”太強(qiáng)大了,在這里例舉一下吧。
貼子的板凳給出了這樣的答案(這是惡搞的開始)
int x = numberToInvertSign; boolean pos = x > 0; for(int i = 0; i < 2*Math.abs(x); i++){ if(pos){ numberToInvertSign--; } else{ numberToInvertSign++; } }
然后,有人說,n = -n 可以是可以,但不夠晦澀,于是一個(gè)晦澀的解決方案出現(xiàn)了:
int n = ....; n = (0xffffffff ^ n) + 1;
然后,又出現(xiàn)了一些看似簡單,其實(shí)是比較晦澀的方案
<code>n = ~n + 1; </code>
<code><code>n = ~--n; </code></code>
繼續(xù),有才的人從來就不少:
<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>
呵呵,開始越來越強(qiáng)大了,我以前也向大家介紹過《如何加密/弄亂C源代碼》的文章,和這些惡搞的人可能有點(diǎn)相似吧。上面這個(gè)例子一出,大家都在討論上面例子中的for循環(huán)語句,呵呵,很費(fèi)解啊。
然后,后面幾個(gè)就開始亂來了:
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 }
不過事情還沒有結(jié)束,看看下面這個(gè)吧,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); }
別忘了面象對(duì)象,有最新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()); } }
這個(gè)貼子基本上就是兩頁,好像不算太嚴(yán)重,如果你這樣想的話,你就大錯(cuò)特錯(cuò)了。這個(gè)貼子被人轉(zhuǎn)到了reddit.com,于是一發(fā)不可收拾,在上面的回貼達(dá)到了490多條。鏈接如下:
http://www.reddit.com/r/programming/comments/9egb6/programming_is_hard/
有人說,要用try catch;有人說要使用XML配置文件……,程序員們?cè)谧分鸶鼮樽儜B(tài)和瘋狂的東西,并從中找到快樂,呵呵。
看完后,正如reddit.com所說——“編程好難啊”!
無獨(dú)有偶,這并不是第一次,也不會(huì)是最后一次,讓我們看看在PHP的官網(wǎng)上發(fā)生的類似的一幕——討論P(yáng)HP的abs取絕對(duì)值函數(shù)的函數(shù)說明文檔中的回復(fù):
http://us.php.net/manual/en/function.abs.php#58508
又是一個(gè)長貼,還帶著很多性能分析,真的很好很強(qiáng)大!
轉(zhuǎn)自:http://coolshell.cn/articles/1391.html