光滑的方式来反转Python中数字的(二进制)数字?

mat*_*ots 6 python algorithm bit-manipulation

我正在寻找一个光滑的函数,它反转数字的二进制表示的数字.

如果f我有这样的功能

int(reversed(s),2) == f(int(s,2)) 每当s是一串零,一个以1开头.

现在我正在使用 lambda x: int(''.join(reversed(bin(x)[2:])),2)

就简洁而言,这是好的,但这似乎是一种相当迂回的方式.

我想知道是否有一个更好的(也许更快)的方式与位运算符,什么不是.

Kel*_*sey 7

您可以使用这样的移位运算符来执行此操作:

def revbits(x):
    rev = 0
    while x:
        rev <<= 1
        rev += x & 1
        x >>= 1
    return rev
Run Code Online (Sandbox Code Playgroud)

它看起来并不比你的方法快(事实上,对我来说稍慢).


ars*_*jii 6

怎么样

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

要么

int(bin(n)[:1:-1], 2)
Run Code Online (Sandbox Code Playgroud)

第二种方法似乎是两者中较快的,但两者都比你当前的方法快得多:

import timeit

print timeit.timeit("int('{0:b}'.format(n)[::-1], 2)", 'n = 123456')

print timeit.timeit("int(bin(n)[:1:-1], 2)", 'n = 123456')

print timeit.timeit("int(''.join(reversed(bin(n)[2:])),2)", 'n = 123456')
Run Code Online (Sandbox Code Playgroud)
1.13251614571
0.710681915283
2.23476600647