2016-02-26 45 views
-1

我一直试图使用scala来通过仅使用移位,强制和切换来反转位位置。我在想,如果有人能找到我的错误,我一直盯着我的代码太长,现在:)没有toBinaryString的反向位位置

例子:

1010 1010 -> 0101 0101 
1100 1001 -> 1001 0011 

这里是我的代码大气压:

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

你知道你在回报中拼错了'reverced',对吗? – sfletche

+0

哦,是的,我喜欢。在这里复制这只是一个错字。我现在修复它 – Duzzz

+0

您的代码不能编译,一开始。你在问如何编译它,或者修复它产生的错误答案?另外,你依靠>> 1填充,但是在词的第一位之后(这将导致填充为零),最高位将为零,因此所有未来的位移(无论是>>还是>>>)将导致一个零位。这是一个奇怪的做法,说实话,我不知道你的意图是什么...... –

回答

1

只要采取任何答案为Java implementation,并在斯卡拉更简单。 (我添加了一个明确的比特大小)。如:

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) 
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) 
+0

'out |'是什么? – Det

0

java.lang.Integer中和长有位(或字节)的倒车方法,但对于一些愚蠢的理由,java.lang.Byte的犯规,所以如果你只使用此方法,记得转移在字节正确:

如:(Integer.reverse(x) >>> 24) & 0xFF

这可能比你自己写所有的位操作,如果没有达到那个更简单,和Oracle有一个很好的优化版本实现了它32个& 64个整数