2012-10-01 112 views
19

給定一個十進制整數(例如65),如何反轉Python中的基礎位?即。以下操作:顛倒Python整數的位

65 → 01000001 → 10000010 → 130 

看來,這個任務可以分解爲三個步驟:

  1. 轉換十進制整數二進制表示
  2. 反轉位
  3. 轉換回十進制

步驟#2和步驟3看起來相當簡單(參見thisthis SO步驟#2有關的問題),但我堅持步驟#1。步驟#1的問題是檢索填充零(即65 = 01000001,而不是1000001)的完整十進制表示。

我搜索了一下,但我似乎無法找到任何東西。

+1

對於第一步,您可以使用'str(bin(65))[2:] .zfill(8)'。懶惰/厭倦現在進一步研究。但你可能應該像拉曼斯曼所說的那樣做。 – BrtH

回答

27
int('{:08b}'.format(n)[::-1], 2) 

可以代替8.如果你想獲得真正看中指定任何填充長度,

b = '{:0{width}b}'.format(n, width=width) 
int(b[::-1], 2) 

可讓您以編程方式指定寬度。

+1

優雅而簡潔。我需要將格式字符串更改爲「{:08b}」,才能按照指定的方式工作。 –

+0

啊,是的,他想要填充零。我會修改。 – nneonneo

+0

如果我做'int('{:b}'.format(65)[:: - 1],2)',我只是'65'作爲輸出。使用'{:08b}'而不是'{:b}'可以給出正確的結果,所以+1爲優雅的解決方案。 – BrtH

4

沒有必要,也沒有辦法「將十進制整數轉換爲二進制表示」。所有的Python整數都表示爲二進制;他們只是爲了方便而轉換成小數點。

如果您想按照this solution來解決逆轉問題,您只需要找到合適的numbits。您可以手動指定,也可以使用n.bit_length()來計算表示整數n所需的位數。

然而,對於65,這會給你7,因爲沒有理由爲什麼65應該需要更多的位。 (您可能要四捨五入到的8最接近的倍數...)

+0

不是很正確,因爲你可以得到一個表示位('bin(n)'或'':{:b}'.format(n)')的字符串。另外,您可以使用'.bit_length()'來查找表示數字所需的位數。 – nneonneo

+0

@nneonneo:我假設OP想要處理整數本身而不是字符串表示,給定鏈接。但是感謝'bit_length'方法,不知道這一點。 –

4

如果你是更快的速度後,就可以使用所描述的技術, http://leetcode.com/2011/08/reverse-bits.html

def reverse_mask(x): 
    x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1) 
    x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2) 
    x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4) 
    x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8) 
    x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16) 
    return x 
2

您可以通過換擋和掩碼測試數第i位。例如,65中的第6位是(65 >> 6) & 1。您可以按照相似的方式進行設置,方法是左移正確的次數1。這些見解爲您提供了這樣的代碼(它在'n'位的字段中反轉了x)。

def reverse(x, n): 
    result = 0 
    for i in xrange(n): 
     if (x >> i) & 1: result |= 1 << (n - 1 - i) 
    return result 

print bin(reverse(65, 8)) 
3
def reverse_bit(num): 
    result = 0 
    while num: 
     result = (result << 1) + (num & 1) 
     num >>= 1 
    return result 

我們並不真正需要的整數轉換成二進制,因爲整數實際上是在Python中的二進制文件。

顛倒的想法就像做整型空間顛倒。

def reverse_int(x): 
    result = 0 
    pos_x = abs(x) 
    while pos_x: 
     result = result * 10 + pos_x % 10 
     pos_x /= 10 
    return result if x >= 0 else (-1) * result 

對於每個循環,原始數字將放棄最右邊的位(以二進制形式)。當新位被添加時,我們得到最右邊的位並在下一個循環中乘以2(<<1)。