2010-06-16 65 views
1

我有這2個功能,我從一些其他的代碼如何讓位旋轉功能接受任何位的大小?

def ROR(x, n): 
    mask = (2L**n) - 1 
    mask_bits = x & mask 
    return (x >> n) | (mask_bits << (32 - n)) 

def ROL(x, n): 
    return ROR(x, 32 - n) 

了,我想在一個程序,在需要16位輪換使用它們。然而,也有需要32度旋轉等功能,所以我想離開這個方程式中的32,所以我就:

def ROR(x, n, bits = 32): 
    mask = (2L**n) - 1 
    mask_bits = x & mask 
    return (x >> n) | (mask_bits << (bits - n)) 

def ROL(x, n, bits = 32): 
    return ROR(x, bits - n) 

然而,答案就出來了錯了,當我測試了這個出發了。然而,當代碼是

def ROR(x, n): 
    mask = (2L**n) - 1 
    mask_bits = x & mask 
    return (x >> n) | (mask_bits << (16 - n)) 

def ROL(x, n,bits): 
    return ROR(x, 16 - n) 

發生了什麼,我該如何解決這個問題?

+1

什麼是在那裏做「L」?它不應該只是「2 ** n」而不是「2L ** n」? – KIAaze 2013-05-06 16:08:07

+0

另外,爲什麼不簡單地使用'1 << n'而不是'2 ** n'? – 2013-12-06 09:55:25

回答

6

那麼,看看你打電話給ROL(x, n, 16)會發生什麼。它叫ROR(x,16-n),這相當於ROR(x,16-n,32),但你真正想要的是ROR(x, 16-n, 16)

+0

第一次ROR應該是ROL? – 2010-06-16 23:29:31

+0

是的,謝謝。編輯。 – 2010-06-17 01:34:39

3

基本上,@ GregS的含義是正確的答案,你需要在你的第二個實施解決了一個細節:

def ROL(x, n, bits=32): 
    return ROR(x, bits - n, bits) 

(我會做這樣的評論,但我不能有可讀格式化的代碼! - )。