我一直试图通过仅使用移位,强制和切换来使用scala来反转位位置。我想知道是否有人能找到我的错误,我现在一直在盯着我的代码:)
示例:
1010 1010 -> 0101 0101
1100 1001 -> 1001 0011
这是我的代码atm:
def reverse(word: Byte): Byte = {
var r = 0x00 // Reversed bitstring
for (i <- 0 to 7) {
if ((word >> (7 - i) & 1) == 1) r = r & 1
r >> 1
}
r
}
旧:
def reverse(word: Byte) = {
var reversed = 0xFF.toByte
for (i <- 0 to 7) {
if ((word >> i & 1) == 1) {
reversed = reversed >> 1
}
else reversed = reversed >>> 1
}
reversed
}
答案 0 :(得分:1)
只需获取Java implementation的任何答案,并在Scala中更简单。 (我添加了一个明确的位大小)。像:
import annotation.tailrec
@tailrec
def reverse(in: Int, n: Int = 8, out: Int = 0): Int =
if (n == 0) out
else reverse(in >>> 1, n - 1, (out << 1) | (in & 1))
对于位数,从输入到输出复制最低位并向相反方向移位。验证:
assert(reverse(0xAA) == 0x55)
assert(reverse(0xC9) == 0x93)
for (x <- 0x00 to 0xFF) assert(reverse(reverse(x)) == x)
答案 1 :(得分:0)
这是一个奇怪的问题,花时间解决...家庭作业?
@tailrec
def reverse(in: Int, out: Int = 0, n: Int = 0): Int =
if(in == 0) out else reverse(in >> 1, out | (in & 1) << (7-n), n+1)
答案 2 :(得分:0)
java.lang.Integer和Long有反转位(和字节)的方法,但由于某些愚蠢的原因,java.lang.Byte没有,所以如果你只是使用这个方法,记得转换字节正确:
例如:(Integer.reverse(x) >>> 24) & 0xFF
这可能比自己编写所有按位操作更容易,如果不是那么多,并且Oracle使用针对32和64位整数的优化版本来实现它