2013-04-28 75 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