【发布时间】:2016-08-19 04:49:14
【问题描述】:
这在 C/C++ 中非常简单,但我想知道 Scala 中最优雅的方式是什么?谢谢!
【问题讨论】:
-
shorts.flatMap(s => List((s >> 8).toByte, s.toByte)).toArray
标签: scala type-conversion bytearray short
这在 C/C++ 中非常简单,但我想知道 Scala 中最优雅的方式是什么?谢谢!
【问题讨论】:
shorts.flatMap(s => List((s >> 8).toByte, s.toByte)).toArray
标签: scala type-conversion bytearray short
考虑位操作,例如移位和屏蔽,以提取 Scala/Java Short 的高字节和低字节(采用与 C/C++ 中非常相似的方式);让
val xs = (253 to 257).map(_.toShort).toList
xs: List[Short] = List(253, 254, 255, 256, 257)
等等
def upper(x: Short) = ((x >> 8) & 0xFF).toByte
upper: (x: Short)Byte
def lower(x: Short) = (x & 0xFF).toByte
lower: (x: Short)Byte
xs.map( x => (upper(x), lower(x)) ).toArray
res2: Array[(Byte, Byte)] = List((0,-3), (0,-2), (0,-1), (1,0), (1,1))
每个元组收集每个Short 值的高字节和低字节。
一种扁平化上述元组数组的方法,
xs.flatMap( x => Array(upper(x), lower(x)) ).toArray
res3: Array[Byte] = Array(0, -3, 0, -2, 0, -1, 1, 0, 1, 1)
【讨论】:
这在 Scala 中很容易做到,事实上,您几乎可以将问题中的英文句子直接翻译成代码。假设您有一个名为l 的List[Short]:
l.map(_.toByte).toArray
显然,您需要确保列表中的所有Shorts 实际上都适合Byte,否则您将得到截断的结果。
【讨论】: