這是否意味着第100個常數必須是1 < < 100?是否有可能爲〜100個常量創建一個位掩碼?
3
A
回答
4
您不能直接這樣做,因爲對於long
值,可以用作位掩碼的原始數字的最大大小實際上是64位。你可以做的是將位掩碼分成2個或更多的int
s或long
s,然後手動管理它。
int[] mask = new int[4];
final int MAX_SHIFT = 32;
void set(int b) {
mask[b/MAX_SHIFT] |= 1 << (b % MAX_SHIFT);
}
boolean isSet(int b) {
return (mask[b/MAX_SHIFT] & (1 << (b % MAX_SHIFT))) != 0;
}
+0
除非奇蹟出現並優化div和mod進入右移/逐位......並且與上述操作相比,成本將會更高。對於不涉及總線/一致性/緩存未命中的CPU,Div/Mod是最昂貴的操作之一。 – bestsss
4
您只能使用原始類型中的位數創建簡單的位掩碼。
如果你有一個32位(如在普通的Java)int然後1 < < 31是你可以移動最低位的最多。
要使用較大的常量使用int元素數組,並且通過將32除以32(使用32位int)並使用%32(modula)移入所選數組元素來確定使用哪個數組元素。
0
是的,如果你打算能位或任何這些常量在一起或全部,那麼你將需要代表每個固定了一下。當然,如果你使用的是int
,你將只有32位,而long
只會給你64位。
13
您可以使用BitSet來設置或清除任意數量的位。例如
BitSet bitSet = new BitSet(101);
bitSet.set(100);
2
Effective Java Item#32建議使用EnumSet而不是位域。在內部,它使用一個位向量,因此它是有效的,但是,由於每個位都有一個描述性名稱(枚舉常量),因此它變得更加可讀。
相關問題
- 1. 用BigInts創建一個位掩碼
- 2. 測試一個位掩碼是否只有一個標誌
- 3. Matlab創建一個掩碼
- 4. Git - 是否有可能創建一個存儲庫佔位符?
- 5. 用大量選項創建一個位掩碼
- 6. 是否有可能從JavaScript創建一個xsl變量?
- 7. 是否有可能爲CRM 2011構建一個32位插件?
- 8. 是否有可能在C#中創建一個全局常量字符數組?
- 9. 是否可以創建一個掩碼來處理非北美電話號碼?
- 10. 創建一個常量位向量
- 11. 是否可以爲一個位置創建兩個標記?
- 12. 是否有可能創建一個包含單個jar的ClassLoader?
- 13. 是否有可能在一個表中創建兩個主鍵
- 14. 是否有可能強制TeamCity爲每個SVN提交創建一個構建?
- 15. 是否有可能創建一個64位和32位的DLL? C++
- 16. 是否有可能創建一個可選擇的選項組
- 17. 是否有可能創建一個沒有AJAX的按鈕?
- 18. 是否有可能創建一個沒有行的派生表?
- 19. rails3是否有可能創建一個沒有限制的model.scope
- 20. 是否有可能在Typescript迭代一個常量枚舉?
- 21. 是否有可能在Java中聲明一個1位變量?
- 22. 什麼是創建一個位範圍的位掩碼的最佳做法?
- 23. 創建一個32位的最有效的方法的位掩碼
- 24. 是否有可能創建一個需要邊緣才能創建的頂點
- 25. 是否有可能爲XlsxWriter中的每個迭代創建一個新列
- 26. 是否有可能爲每個用戶創建一個web服務?
- 27. 位掩碼:如何確定是否只有一個位被設置
- 28. 是否可以在Rust中創建一個私有變量?
- 29. C#:是否有可能從program.cs中的資源圖像創建一個位圖?
- 30. 是否有可能根據水龍頭的位置創建一個水龍頭?
'long'(Java中最大的整數原語)只有64位。所以,不:沒有*單個*原始值。 – 2013-02-04 22:16:29