2016-02-26 48 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個整數