有没有更好的方法将Bytes序列转换为Seq [Boolean],其中每个元素代表Byte序列中的一个位?
我目前正在这样做,但是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实现?
答案 0 :(得分: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
答案 1 :(得分:0)
无论它值多少,你都可以将字节转换为BinaryString,然后转换为布尔值序列:
val b1 : Byte = 7
(0x100 + b1).toBinaryString.tail.map{ case '1' => true; case _ => false }
结果:Vector(false,false,false,false,false,true,true,true)
而且,你会回到(Booleans to Byte):
val s1 = Vector(false, false, false, false, false, true, true, true)
Integer.parseInt( s1.map{ case true => '1'; case false => '0' }.mkString, 2 ).toByte