3

各要素が Byte シーケンスのビットを表す Seq[Boolean] に Bytes のシーケンスを変換するより良い方法はありますか?

私は現在これをやっていますが、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 }

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


そして、次のように (ブール値からバイトへ) 戻ります。

  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 に答える