對於已知大小但大於64位的位掩碼,處理(即,執行所有按位操作)的最有效的數據結構是什麼?java - 大於64位的快速位掩碼
byte[]
? BigInteger
?還有其他的東西嗎?
需要是Java 7的兼容,並且要快(或至少一樣快,可以合理地預期,鑑於其大小)之類的東西
if(bitmask & 7 != 0){...}
和
bitmask1 |= bitmask2
等上。
對於已知大小但大於64位的位掩碼,處理(即,執行所有按位操作)的最有效的數據結構是什麼?java - 大於64位的快速位掩碼
byte[]
? BigInteger
?還有其他的東西嗎?
需要是Java 7的兼容,並且要快(或至少一樣快,可以合理地預期,鑑於其大小)之類的東西
if(bitmask & 7 != 0){...}
和
bitmask1 |= bitmask2
等上。
你不能直接這樣做,因爲一個可以用作位掩碼的原始數字的最大大小實際上是一個長數值的64位。你可以做的是將位掩碼分成兩個或多個整數或長整數,然後手動管理它。
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;
}
或者你使用的BitSet
BitSet bitSet = new BitSet(101);
bitSet.set(100);
是的,BitSet足夠快,並有一些不錯的操作。雖然不是_shifting_位。 –
@JoopEggen右移,至少有一個解決方案。 https://stackoverflow.com/questions/9008150/shifting-a-java-bitset(他們稱之爲左移,但左移向另一個方向,對我來說)。對於左移,我不會立即看到解決方案,而是擴展「BitSet」並添加一個方法,使存儲的值增加一個給定量。你做? – User1291
@ User1291似乎是原始位集的子範圍,但未重新索引。如果保持起始索引偏移量,至少有一部分偏移(向左或向右清除)。 –
的BigInteger當然可以做到所有這些事情。但是,BigInteger實例是不可變的,所以對它的任何操作都會產生一個新的BigInteger對象。您可能需要嘗試確定其性能是否可以接受。 – VGR