没有toBinaryString的反转位位置

时间:2016-02-26 12:24:17

标签: scala reverse bit

我一直试图通过仅使用移位,强制和切换来使用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
} 

3 个答案:

答案 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位整数的优化版本来实现它