2013-04-28 30 views
2

每一位有没有更好的办法来一个字节序列转换成一个序列[布尔],其中每个元素代表的字节序列的位?如何在SEQ(字节)转换为数组[布尔]表示斯卡拉

我正在这样做,但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

首先,蓄电池在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 
+0

我让它变得可变,以削减每一步创建新集合的开销......至于你的第二点:DOH!是的,这似乎是明显的方法不是。我是新来的Scala和函数式编程。我经常发现自己为了自己的利益而努力过于棘手。 – 2013-04-28 21:34:17

+0

有关[FP in scala](http://www.manning.com/bjarnason/)的很棒的书。你一定要检查一下。 – 4e6 2013-04-29 05:27:08

0

不管它的价值,你可以一个字节转换为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