2012-10-01 83 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)。