如果我有一个整数,我想进行位操作,我怎样才能将它加载到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. 来自整数的商C
- 4. 2长长整数的LCM
- 5. 长整数溢出
- 6. 长整数除法
- 7. 长整数计算
- 8. 长整数乘法
- 9. 长整数运算
- 10. 长整数个别数字?
- 11. JavaScript - 来自整数的负数字节
- 12. 将长整型转换为整数
- 13. 实现参数很长的Bitset函数
- 14. 整数整数与整数的整数
- 15. 长按滚动整数 - Android
- 16. MySQL - 设置整数长度
- 17. 整数长时间的HashMap
- 18. 小整数类型长度
- 19. Java限制长度整数
- 20. C++任意长度整数
- 21. PHP处理长整数
- 22. Swift中的长整数
- 23. 来自php整数的布尔值
- 24. 来自json_normalize的pandas中的NA整数
- 25. 整合来自多列的数据
- 26. 来自字符串的子串整数
- 27. 使用来自PLCrashReport的完整数据
- 28. 用长整数长计算错误
- 29. C:为什么整数作为长整数?
- 30. Java中长整数存储两个整数
就我个人而言,我会说原始位操作是去这里的路。它并不是那么复杂,正如你所说,我没有看到一个简单的方法来获得一个int或long到一个BitSet。 – 2010-03-18 22:07:40