在Python中反转数字的(二进制)位的巧妙方法?

8 投票
7 回答
35572 浏览
提问于 2025-04-17 17:43

我在寻找一个简单好用的函数,可以把一个数字的二进制表示中的数字反转过来。

如果有一个叫 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

撰写回答