如何将Seq [Byte]转换为表示Scala中每个位的Array [Boolean]

时间:2013-04-28 20:56:01

标签: scala byte bit bitset

有没有更好的方法将Bytes序列转换为Seq [Boolean],其中每个元素代表Byte序列中的一个位?

我目前正在这样做,但是byte2Bools看起来有点太重了......

object Main extends App {

  private def byte2Bools(b: Byte) =
    (0 to 7).foldLeft(ArrayBuffer[Boolean]())((bs, i) => bs += isBitSet(b, i))

  private def isBitSet(byte: Byte, bit: Int) =
    ((byte >> bit) & 1) == 1

  val bytes = List[Byte](1, 2, 3)
  val bools = bytes.flatMap(b => byte2Bools(b))

  println(bools)

}

也许真正的问题是:什么是更好的byte2Bools实现?

2 个答案:

答案 0 :(得分:2)

首先,foldLeft中的累加器不一定需要是可变集合。

def byte2Bools(b: Byte): Seq[Boolean] = 
  (0 to 7).foldLeft(Vector[Boolean]()) { (bs, i) => bs :+ isBitSet(b)(i) }

其次,您可以使用isBitSet映射初始序列。

def byte2Bools(b: Byte): Seq[Boolean] =
  0 to 7 map isBitSet(b)

def isBitSet(byte: Byte)(bit: Int): Boolean =
  ((byte >> bit) & 1) == 1

答案 1 :(得分:0)

无论它值多少,你都可以将字节转换为BinaryString,然后转换为布尔值序列:

  val b1 : Byte = 7
  (0x100 + b1).toBinaryString.tail.map{ case '1' => true; case _ => false }

结果:Vector(false,false,false,false,false,true,true,true)


而且,你会回到(Booleans to Byte):

  val s1 = Vector(false, false, false, false, false, true, true, true)
  Integer.parseInt( s1.map{ case true => '1'; case false => '0' }.mkString, 2 ).toByte