如果我有一個整數,我想進行位操作,我怎樣才能將它加載到java.util.BitSet
?我怎樣才能將它轉換回int或long?我並不關心BitSet
的大小 - 它總是32位或64位長。我只想使用set()
,clear()
,nextSetBit()
和nextClearBit()
方法而不是按位運算符,但我找不到使用數字類型初始化位集的簡單方法。BitSet來自整數/長整數
回答
下面的代碼創建一個位從長值,反之亦然設置:
public class Bits {
public static BitSet convert(long value) {
BitSet bits = new BitSet();
int index = 0;
while (value != 0L) {
if (value % 2L != 0) {
bits.set(index);
}
++index;
value = value >>> 1;
}
return bits;
}
public static long convert(BitSet bits) {
long value = 0L;
for (int i = 0; i < bits.length(); ++i) {
value += bits.get(i) ? (1L << i) : 0L;
}
return value;
}
}
編輯:現在兩個方向,@leftbrain:原因,你是對的
因爲我們要檢查是否設置了0位,所以我認爲行(值%1L!= 0)應該是(值%2L!= 0) – 2010-10-30 14:07:26
'if(value&1!= 0)''%'是模運算符,'它始終爲0,因爲所有數字都可以被1 – ithkuil 2012-02-16 15:22:07
FYI整除,這就創建了一個小端順序的bitset – 2012-09-03 09:03:19
Java 7中具有BitSet.valueOf(byte[])
和BitSet.toByteArray()
如果你被卡住的Java 6或更早的版本,你可以使用BigInteger
如果它是不太可能是一個性能瓶頸 - 它有getLowestSetBit
,setBit
和clearBit
種方法(過去兩年將創建一個新BigInteger
,而不是就地修改。)
添加到finnw答案:也有BitSet.valueOf(long[])
和BitSet.toLongArray()
。所以:
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
差不多直接從nextSetBit
的文檔value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
value += (1 << i)
}
對於大於32或64位的BitSet,這會失敗,在這種情況下,您需要在輸出處處理一個int []或long []。但OP明確不在乎,這麼公平。只是一些小毛病:如果長時間,你應該'1L << i',以防止溢出,並且像'value | = 1L << i'這樣的OR就足夠了。 – charlie 2016-07-04 12:46:11
要獲得long
從小BitSet
回來'流j'方式:
long l = bitSet.stream()
.takeWhile(i -> i < Long.SIZE)
.mapToLong(i -> 1L << i)
.reduce(0, (a, b) -> a | b);
反之亦然:
BitSet bitSet = IntStream.range(0, Long.SIZE - 1)
.filter(i -> 0 != (l & 1L << i))
.collect(BitSet::new, BitSet::set, BitSet::or);
N.B .:使用BitSet::valueOf
和BitSet::toLongArray
當然更容易。
- 1. 'BitSet'是否存儲位或整數?
- 2. 整數類型長整數和分數
- 3. 2長長整數的LCM
- 4. 長整數運算
- 5. 長整數計算
- 6. 長整數溢出
- 7. 長整數乘法
- 8. 長整數個別數字?
- 9. 將長整型轉換爲整數
- 10. 整數整數與整數的整數
- 11. 長按滾動整數 - Android
- 12. 小整數類型長度
- 13. 使用來自PLCrashReport的完整數據
- 14. 來自字符串的子串整數
- 15. 用長整數長計算錯誤
- 16. C:爲什麼整數作爲長整數?
- 17. 將整數數組轉換爲長整型
- 18. 爲什麼使用整數而不是長整數?
- 19. 交替正整數和負整數的最長切片
- 20. 將整數(長整數)轉換爲jsp中的雙精度值
- 21. 64位上的按位與長整數與整數的性能
- 22. 將長整數列表轉換爲整數
- 23. 固定長度整數數據類型
- 24. C++中長整數的單獨數字
- 25. 整數的ArrayList整數小整數
- 26. 整數數組整數VB.NET
- 27. ggplot2 - 來自數值/整數數據的離散X軸值
- 28. 來自大整數範圍的奇數數
- 29. 用整數填充自定義整數數組
- 30. 整數不加起來
就我個人而言,我會說原始位操作是去這裏的路。它並不是那麼複雜,正如你所說,我沒有看到一個簡單的方法來獲得一個int或long到一個BitSet。 – 2010-03-18 22:07:40