在Scala中将布尔数组转换为字节的最快方法是什么?

时间:2017-10-31 23:38:42

标签: arrays scala optimization binary

在Scala中实现霍夫曼算法后,我现在留下了一个长度超过10.000的位数组。现在我想将这个数组转换为字节,并以尽可能最快的方式将其写入文件。

我目前有以下算法:

val bits = encode(createCodeTree(fileChars))(fileChars)
val string = new StringBuilder
for(List(b1,b2,b3,b4,b5,b6,b7,b8) <- bits.grouped(8)) string.append(bitsToByte(b1,b2,b3,b4,b5,b6,b7,b8))

 def bitsToByte(bits : Boolean*) : Char = {
    var amount = 0;
    for(i <- 1 until bits.length){
      amount += (if(bits(i-1)) 1 else 0) * scala.math.pow(2,i).intValue()
    }
    amount.toChar
  }

我想知道是否还有改进的余地(因为我不认为每次创建新列表都非常优化)。另外,我想知道由于在for(List(b1,b2,b3,b4,b5,b6,b7,b8) <- bits.grouped(8))的列表中使用bits.length%8!=0,这是否可能导致错误的结果?

1 个答案:

答案 0 :(得分:2)

我不知道这是否更快,但它肯定更简洁。

bits.grouped(8)
    .map(_.foldLeft(0)((i,b) => (i<<1) + (if(b) 1 else 0)).toChar)
    .mkString

我也认为这个bit-&gt; byte-&gt;字符转换更正确。

这假设这些位从左到右是最重要的。如果情况并非如此,则将fold.foldLeft(0)((i,b) =>...更改为.foldRight(0)((b,i) =>...