在Python中反转数字的(二进制)位的巧妙方法?
我在寻找一个简单好用的函数,可以把一个数字的二进制表示中的数字反转过来。
如果有一个叫 f
的函数,我希望能满足这个条件:
int(reversed(s),2) == f(int(s,2))
,其中 s
是一个以1开头的零和一组成的字符串。
目前我使用的方式是 lambda x: int(''.join(reversed(bin(x)[2:])),2)
。
这个方法在简洁性上还不错,但感觉有点绕。
我在想,是否有更好(也许更快)的方式,利用位运算符等等。
7 个回答
2
我认为你现在的方法完全可以,但你可以去掉 list()
这个调用,因为 str.join()
可以接受任何可迭代的对象。
def binary_reverse(num):
return int(''.join(reversed(bin(num)[2:])), 2)
另外,我建议不要用 lambda
来写复杂的函数,最好只用在最简单的函数上,这样它只会用一次,并且能让周围的代码更清晰。
我觉得这样做没问题,因为它清楚地描述了你想做的事情——获取一个数字的二进制表示,反转它,然后再得到一个数字。这让代码非常易读,这应该是最重要的。
8
你可以用位移运算符来这样做:
def revbits(x):
rev = 0
while x:
rev <<= 1
rev += x & 1
x >>= 1
return rev
不过,这个方法似乎并没有比你的方法快(实际上,对我来说,反而稍微慢了一点)。
7
这样怎么样
int('{0:b}'.format(n)[::-1], 2)
或者
int(bin(n)[:1:-1], 2)
第二种方法看起来比第一种更快,不过这两种方法都比你现在用的方法快很多:
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')
1.13251614571 0.710681915283 2.23476600647