使用Shift運算符而不是使用除法和乘法的目的是什麼?爲什麼我們需要在java中使用移位運算符?
使用移位操作符還有其他好處嗎?
應該在哪裏嘗試使用移位運算符?
回答
除法和乘法不是真的一個使用位移位運算符。他們是一些過時的「優化」,有些人想申請。
它們是位操作,並且在整數值內的位級別上工作時是完全必要的。
例如,假設我有兩個字節,它們是一個雙字節(16位)無符號值的高位和低位字節。假設你需要構建這個價值。在Java中,這是:
int high = ...;
int low = ...;
int twoByteValue = (high << 8) | low;
如果沒有移位運算符,則無法進行此操作。
要回答你的問題:你在需要使用它們的地方使用它們!並沒有其他地方。當你執行邏輯位的操作
移位運算符使用,而不是數學操作。
它可以用於速度,在處理二進制冪的操作數時比分割/乘法快得多,但通常優先於代碼的清晰度。
鏈接無效。但我發現了另一個解釋相同概念的頁面。 http://crypto.stackexchange.com/questions/19470/how-is-xor-used-for-encryption – shreeneewas
它是構建它們是數字,其中比特被自身分組爲不同的值的組合的值是有用的。 (肖恩·歐文的回答解釋了這個更好。)
例如,對於顏色的是工作:
"#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;
}
強度的降低。
- 通過2與算術移位或邏輯移位的功率替換整數除法或乘法..
- 由恆定偏移用的組合替換整數乘法,增加或是減少。
- 利用乘法器的有限範圍的優勢,用常數替換整數除法。
爲什麼這是錯誤的?
1.隨着計算所需時間的增加而降低性能。 2.算術運算如分頻和乘法運算速度較慢。 3.昂貴的操作
優勢
- 提高性能。
- 更快的計算。
記過
- 代碼可讀性下降。
當你處理標誌它是有用的,你可以在短短一個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。
- 1. 爲什麼我們甚至需要「delete []」運算符?
- 2. 爲什麼我們使用按位運算符?
- 3. 爲什麼我們需要Java 7中的鑽石算子?
- 4. 爲什麼我們需要Java NIO Selector?
- 5. 爲什麼我們需要使用prompt.start()?
- 6. 爲什麼我們需要使用ExitWindowsEx
- 7. 爲什麼他們在XOR-Shift算法中使用按位異或運算符?
- 8. 裝配需要什麼?爲什麼我們使用它們?
- 9. 模型中有什麼?爲什麼我們需要使用它
- 10. 爲什麼此算法在Java中使用按位和運算符?
- 11. 爲什麼要使用按位運算符?
- 12. 爲什麼我們需要在JavaScript
- 13. 爲什麼要在Boost Turtle中爲運算符float()使用MOCK_NON_CONST_METHOD_EXT?
- 14. 爲什麼我們需要在Java中編譯時間常量?
- 15. 爲什麼我們需要在C++中完全使用複製構造函數和賦值運算符
- 16. 爲什麼我的homeopen sizeof運算符需要char *轉換?
- 17. 爲什麼我們需要在並行GC跟蹤中使用SATB算法?
- 18. 爲什麼我們需要在Spring中使用註釋?
- 19. 爲什麼我們需要在ASP .NET 5 wwwroot中使用web.config?
- 20. 爲什麼我們需要在ipv6中使用碎片?
- 21. 爲什麼我們需要在xml設計中使用xmlns:android?
- 22. 爲什麼我們需要使用// <![CDATA [在@using語句中?
- 23. 爲什麼我們需要在IValue Converter中使用ConvertBack
- 24. 爲什麼我們需要在.each()函數中使用$(this)?
- 25. 爲什麼我們需要在stringbuilder中使用toString方法
- 26. 我們爲什麼需要,使用貓鼬有什麼好處
- 27. 爲什麼我們需要通用服務定位器庫?
- 28. 爲什麼移位運算符似乎循環64位整數?
- 29. 爲什麼在下面的運算符重載中需要使用const?
- 30. Java中的運算符優先級(位移運算符):爲什麼以下輸出爲真?
我聽說,這讓速度更快的整數除法/乘法運算比*,/ – Saravanan
左移1比2被乘以速度較快,但,你的JIT編譯器和處理器比你知道這更好,並且應該自動做到這一點。無論如何,這不是班次的主要使用。這可以說是一個不錯的用途。 –
不在java中。這些日子甚至都沒有。編譯器足夠聰明,可以優化您的代碼。最好確保你的代碼是可讀的,並且表達它想要做的事情,而不是試圖超越編譯器並使其不可讀。 –