反转Python整数的位

Dav*_*ard 26 python bit-manipulation python-2.7

给定一个十进制整数(例如65),如何反转Python中的底层位?即.以下操作:

65 ? 01000001 ? 10000010 ? 130
Run Code Online (Sandbox Code Playgroud)

看来这个任务可以分为三个步骤:

  1. 将十进制整数转换为二进制表示
  2. 反转位
  3. 转换回十进制

步骤#2和3似乎很简单(见 SO问题关系到步骤#2),但我卡上的步骤1#.步骤#1的问题是检索带有填充零的完整十进制表示(即65 = 01000001,而不是1000001).

我四处寻找,但似乎找不到任何东西.

nne*_*neo 37

int('{:08b}'.format(n)[::-1], 2)
Run Code Online (Sandbox Code Playgroud)

您可以指定任何填充长度代替8.如果您想要真正的花哨,

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

允许您以编程方式指定宽度.

  • 优雅简洁。我需要将格式字符串更改为“{:08b}”才能按指定工作。 (2认同)

小智 7

如果您的速度更快,可以使用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
Run Code Online (Sandbox Code Playgroud)


Jay*_*ong 6

def reverse_bit(num):
    result = 0
    while num:
        result = (result << 1) + (num & 1)
        num >>= 1
    return result
Run Code Online (Sandbox Code Playgroud)

我们实际上并不需要将整数转换为二进制,因为整数在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
Run Code Online (Sandbox Code Playgroud)

对于每个循环,原始数字将丢弃最右边的位(二进制)。我们获得最右边的位,并<<1在添加新位时在下一个循环中将2()相乘。

  • 您必须考虑要反转的位数。例如,您想要反转字节中的位。您希望 0x1 将被转换为 0x80 (0b00000001 -&gt; 0b10000000)。使用当前的实现,您仍然会在输出上获得 0x1 (2认同)

小智 6

最好的方法是逐位执行

def reverse_Bits(n, no_of_bits):
    result = 0
    for i in range(no_of_bits):
        result <<= 1
        result |= n & 1
        n >>= 1
    return result
# for example we reverse 12 i.e 1100 which is 4 bits long
print(reverse_Bits(12,4))
Run Code Online (Sandbox Code Playgroud)