3

Is there a better way to convert a sequence of Bytes into an Seq[Boolean] where each element represents a bit from the Byte sequence?

I'm currently doing this, but byte2Bools seems a little too heavy...

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)

}

Perhaps the real question is: what's a better implementation of byte2Bools?

2 Answers 2

4

First, accumulator in foldLeft is not necessary need to be a mutable collection.

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

Second, you can just map initial sequence with isBitSet.

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

def isBitSet(byte: Byte)(bit: Int): Boolean =
  ((byte >> bit) & 1) == 1
Sign up to request clarification or add additional context in comments.

2 Comments

I made it mutable to cut out the overhead of creating a new collection every step... as for your second point: DOH! Yes, that seems like the obvious approach doesn't it. I'm new to Scala and functional programming in general. I often find myself trying to get too tricky for my own good.
There is great book about FP in scala. You should definitely check it out.
1

For whatever it's worth, you can convert a Byte to a BinaryString and then to sequence of Booleans with:

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

Results in: Vector(false, false, false, false, false, true, true, true)


And, you would go back (Booleans to Byte) with:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.