3

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

我目前正在这样做,但 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 的更好实现是什么?

4

2 回答 2

4

首先,累加器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
于 2013-04-28T21:30:44.470 回答
1

不管它值多少钱,您都可以将 Byte 转换为 BinaryString,然后转换为布尔序列:

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

结果:向量(假,假,假,假,假,真,真,真)


而且,您将返回(布尔到字节):

  val s1 = Vector(false, false, false, false, false, true, true, true)
  Integer.parseInt( s1.map{ case true => '1'; case false => '0' }.mkString, 2 ).toByte
于 2013-04-29T01:05:06.777 回答