2011-09-17 28 views

回答

13

除法和乘法不是真的一個使用位移位運算符。他們是一些過時的「優化」,有些人想申請。

它們是位操作,並且在整數值內的位級別上工作時是完全必要的。

例如,假設我有兩個字節,它們是一個雙字節(16位)無符號值的高位和低位字節。假設你需要構建這個價值。在Java中,這是:

int high = ...; 
int low = ...; 
int twoByteValue = (high << 8) | low; 

如果沒有移位運算符,則無法進行此操作。

要回答你的問題:你在需要使用它們的地方使用它們!並沒有其他地方。當你執行邏輯位的操作

+0

我聽說,這讓速度更快的整數除法/乘法運算比*,/ – Saravanan

+2

左移1比2被乘以速度較快,但,你的JIT編譯器和處理器比你知道這更好,並且應該自動做到這一點。無論如何,這不是班次的主要使用。這可以說是一個不錯的用途。 –

+6

不在java中。這些日子甚至都沒有。編譯器足夠聰明,可以優化您的代碼。最好確保你的代碼是可讀的,並且表達它想要做的事情,而不是試圖超越編譯器並使其不可讀。 –

6

移位運算符使用,而不是數學操作。

可以用於速度,在處理二進制冪的操作數時比分割/乘法快得多,但通常優先於代碼的清晰度。

1

它是構建它們是數字,其中比特被自身分組爲不同的值的組合的值是有用的。 (肖恩·歐文的回答解釋了這個更好。)

例如,對於顏色的是工作:

  • "#AARRGGBB"爲base16字符串
  • 0xAAAARRRRGGGGBBBB爲整數

在其整數格式,您可以使用shift來獲取整數分量的實際值作爲可用數字。當操作被由執行更快的等效操作替換髮生

public static int stringToColor(String s) throws JSExn { 
    // string starts with '#' - parse integer from string 
    try { 
     // used to build up the return value 
     int a, r, g, b; 

     switch (s.length()) { 
     case 4: 
      a = 0xFF000000; 
      r = Integer.parseInt(s.substring(1, 2), 16); 
      r = r << 16 | r << 20; 
      b = Integer.parseInt(s.substring(2, 3), 16); 
      b = b << 8 | b << 12; 
      g = Integer.parseInt(s.substring(3, 4), 16); 
      g = g | g << 4; 
      break; 
     case 5: 
      a = Integer.parseInt(s.substring(1, 2), 16); 
      a = a << 24 | a << 28; 
      r = Integer.parseInt(s.substring(2, 3), 16); 
      r = r << 16 | r << 20; 
      b = Integer.parseInt(s.substring(3, 4), 16); 
      b = b << 8 | b << 12; 
      g = Integer.parseInt(s.substring(4, 5), 16); 
      g = g | g << 4; 
      break; 
     case 7: 
      a = 0xFF000000; 
      r = Integer.parseInt(s.substring(1, 3), 16) << 16; 
      b = Integer.parseInt(s.substring(3, 5), 16) << 8; 
      g = Integer.parseInt(s.substring(5, 7), 16); 
      break; 
     case 9: 
      a = Integer.parseInt(s.substring(1, 3), 16) << 24; 
      r = Integer.parseInt(s.substring(3, 5), 16) << 16; 
      b = Integer.parseInt(s.substring(5, 7), 16) << 8; 
      g = Integer.parseInt(s.substring(7, 9), 16); 
      break; 
     default: 
      throw new JSExn("Not a valid color: '"+s+"'"); 
     } 

     // return our integer ARGB 
     return a | r | b | g; 
} 
0

強度的降低。

  1. 通過2與算術移位或邏輯移位的功率替換整數除法或乘法..
  2. 由恆定偏移用的組合替換整數乘法,增加或是減少。
  3. 利用乘法器的有限範圍的優勢,用常數替換整數除法。

爲什麼這是錯誤的?

1.隨着計算所需時間的增加而降低性能。 2.算術運算如分頻和乘法運算速度較慢。 3.昂貴的操作

優勢

  1. 提高性能。
  2. 更快的計算。

記過

  1. 代碼可讀性下降。
0

當你處理標誌它是有用的,你可以在短短一個int變量存儲有關有效標誌的信息,請參閱以下請:

public class DealingWithShiftOperators { 

    public static void main(String[] args) { 

     int active_flags = 10; 

     printActiveFlags(active_flags); 

    } 

    public static void printActiveFlags(int active_flags) { 

     final int TOTAL_FLAGS = 8; 
     final int MAX_VALUE = 1 << TOTAL_FLAGS; 
     final int MIN_VALUE = 1; 

     int current_flag = MAX_VALUE; 

     do { 
      current_flag = current_flag >> 1; 

      if (active_flags - current_flag < 0) { 
       System.out.println(current_flag + ": off"); 
      } else { 
       active_flags = active_flags - current_flag; 
       System.out.println(current_flag + ": on"); 
      } 

     } while (current_flag > MIN_VALUE); 

    } 

} 

上面的例子打印後續的輸出:

128: off 
64: off 
32: off 
16: off 
8: on 
4: off 
2: on 
1: off 

正如可以看到的,active_flags是數字2和我們存儲在只有一個變量的信息,其值是10(8 + 2)號8。

相關問題