Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala位集和移位操作_Scala_Bit Shift_Bitset - Fatal编程技术网

Scala位集和移位操作

Scala位集和移位操作,scala,bit-shift,bitset,Scala,Bit Shift,Bitset,我正在寻找一种用位向量表示一组整数的方法(这将是该组整数的特征函数),并且能够对该组整数执行位运算 起初我认为scala的位集是理想的候选者。然而,根据文档,位集似乎不支持移位操作。经过进一步调查,我还发现相关的Java位集实现也不支持移位操作 我是否只有实现自己的支持移位操作的位集类的选项?此外,根据中给出的描述,在Scala的位集实现上支持移位操作听起来并不困难,或者我在这里误解了什么 提前谢谢 当需要改装新功能时,通常的窍门是“拉皮条我的库”模式。隐式地将位集转换为专用类型,以执行添加的操

我正在寻找一种用位向量表示一组整数的方法(这将是该组整数的特征函数),并且能够对该组整数执行位运算

起初我认为scala的位集是理想的候选者。然而,根据文档,位集似乎不支持移位操作。经过进一步调查,我还发现相关的Java位集实现也不支持移位操作

我是否只有实现自己的支持移位操作的位集类的选项?此外,根据中给出的描述,在Scala的位集实现上支持移位操作听起来并不困难,或者我在这里误解了什么


提前谢谢

当需要改装新功能时,通常的窍门是“拉皮条我的库”模式。隐式地将位集转换为专用类型,以执行添加的操作:

class ShiftableBitSet(bs: BitSet) {
  def shiftLeft(n: Int): BitSet = ... //impl goes here
}

implicit def bitsetIsShiftable(bs: BitSet) = new ShiftableBitSet(bs)

val sample = BitSet(1,2,3,5,7,9)
val shifted = sample.shiftLeft(2)
shiftLeft
更改为您喜欢的任何名称和参数

更新

如果您确实知道将有一个不可变的
位集
,那么访问原始底层数组的一种(稍微有点粗糙的)方法就是模式匹配。也不太痛苦,因为对于不可变的
位集
,只有3个可能的具体子类:

import collection.immutable.BitSet
val bitSet = BitSet(1,2,3)
bitSet match {
  case bs: BitSet.BitSet1 => Array(bs.elems)
  case bs: BitSet.BitSetN => bs.elems 
  case _ => error("unusable BitSet")
}
令人恼火的是,
elems1
param to
BitSet2
不是val,可变位集的
elems
param被标记为protected。所以它不是完美的,但是如果你的集合是不平凡的和不可变的,那么它应该可以做到这一点。对于一般情况,“正常”访问集合不会太昂贵


是的,这种技术将在包装器中使用,如上所述。

您可以使用map,例如向左移动4个位置:

import collection.immutable.BitSet
val bitSet = BitSet(1,2,3)
bitSet map (_ + 4)

由于位集内部使用一个长数组来表示位向量,因此访问该数组对于高效地执行移位操作至关重要(因为长数组上的移位操作本机受支持)。但是,在您建议的包装器实现上,只能使用位集接口本身支持的操作来实现上述功能,这在IMHO中并没有那么有效。感谢您的更新,这听起来(很粗糙,但)很聪明!我曾考虑使用可变的
位集
来避免不必要的对象创建,但正如您所提到的,这个技巧只适用于不可变的
位集
。顺便说一句,我想你的意思是说
BitSet
,而不是在最后一段(?)中说
BitMap
。毫无疑问,它有黑客行为,而且在未来的位集实现中并不健壮。但只要你愿意处理这个问题……这不是(按位)转换。您正在向集合中的所有元素添加4。