2013-02-13 144 views
2

使用>>運營商超過/運營商的優勢是什麼?它在我所維護的代碼中被廣泛使用。 對於例如 int width = previousWidth >> 2;>>運營商超過/運營商的優勢

+3

除非另有說明,否則認爲是優化。但也見http://stackoverflow.com/questions/1168451/is-shifting-bits-faster-than-multiplying-and-dividing-in-java-net – 2013-02-13 08:20:20

+0

一個世紀以前的時間,這真的做了一個區別。今天,這可能意味着編寫這段代碼的人要麼是編程老手,要麼從舊書中學習,要麼試圖混淆你...... ;-) – Axel 2013-02-13 08:44:26

回答

7

當您想要將某個值移位一定數量的位時,理解起來會相當簡單。例如:

byte[] bits = new byte[4]; 
bits[0] = (byte) (value >> 24); 
bits[1] = (byte) (value >> 16); 
bits[2] = (byte) (value >> 8); 
bits[3] = (byte) (value >> 0); 

這顯然是由不同數量的位移位。你會真的想要在分裂方面表示呢?

現在當然,當你真正想要的是除法時,爲了可讀性的緣故,你應該使用除法運算符。有些人爲了性能可能會使用偏移,但是一如既往,對於大多數代碼而言,可讀性比微優化更重要。所以你的情況,如果有什麼實際上期望的是widthpreviousWidth除以4,代碼應該*絕對反映:

int width = previousWidth/4; 

我只用bitshifting這個證明的性能差異後意義重大。

0

它們是不同的操作:

  • >> 2移位的位模式的兩個位到右側(基本上分割的整數由2^2 = 4)。
  • / 2將數字除以2(可以實現爲>> 1)。

請注意,使用>> 1將其他數字類型除以2可能會給出意想不到的結果。

如果您的意思是「除以二」,請鍵入「/ 2」。閱讀你的代碼的人(包括你,在一段時間之後)會感謝你沒有模糊意思。

+1

我敢打賭,他的意思是'1'。 – 2013-02-13 08:19:49

+0

@ Eng.Fouad:我敢打賭他的意思是'/ 2';) – Johnsyweb 2013-02-13 08:24:15

+0

你是對的!我添加了這個代碼片段,僅僅爲 – Abichellam 2013-02-13 08:31:46

0

最有可能什麼也沒有。這將是一個JVM優化,將一個分區轉變爲bitshift。

如果它正在做一個位掩碼,那麼很好,但是如果在上面的情況下,它似乎是寫一個數學運算的一種尷尬的方式,然後考慮將它作爲維護的一部分進行更改(或者只是將它接受爲不好的主意,但保持獨立)。

+0

nup ..這不會發生!..爲自己測試它 – Anirudha 2013-02-13 08:33:40

0

正如其他人已經說過,我建議你總是青睞在優化更具可讀性選項,除非你

  • 肯定需要最優化
  • 知道它的工作原理是
    • 知道你的編譯器
    • 知道你的JVM
    • 把性能測量到位
    • 考慮統計評估這些測量(極值,方差,第一次和以後的測量,......)