簡體   English   中英

光滑的方式來反轉Python中數字的(二進制)數字?

[英]Slick way to reverse the (binary) digits of a number in Python?

我正在尋找一個光滑的函數,它反轉數字的二進制表示的數字。

如果f是這樣的功能我會

int(reversed(s),2) == f(int(s,2))每當s是一個零的字符串和一個以1開頭的字符串。

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

就簡潔而言,這是好的,但這似乎是一種相當迂回的方式。

我想知道是否有一個更好的(也許更快)的方式與位運算符,什么不是。

您可以使用這樣的移位運算符來執行此操作:

def revbits(x):
    rev = 0
    while x:
        rev <<= 1
        rev += x & 1
        x >>= 1
    return rev

它看起來並不比你的方法快(事實上,對我來說稍慢)。

怎么樣

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

這是我的建議:

In [83]: int(''.join(bin(x)[:1:-1]), 2)
Out[83]: 9987

同樣的方法,略有簡化。

我認為你當前的方法非常好,但你可以丟失list()調用,因為str.join()將接受任何iterable:

def binary_reverse(num):
    return int(''.join(reversed(bin(num)[2:])), 2)

除了最簡單的函數之外,它還建議不要使用lambda ,它只使用一次,並通過內聯使周圍的代碼更清晰。

之所以我覺得這很好,因為它描述了你想做什么 - 采用數字的二進制表示,反轉它,然后再次得到一個數字。 這使得這段代碼非常易讀,應該是一個優先事項。

Hacker's Delight的整整半章專門針對這個問題(第7-1節:反轉位和字節)使用二進制運算,位移和其他好東西。 看起來這些在Python中都是可能的 ,它應該比二進制到字符串和反向方法快得多。

這本書不公開,但我發現這篇博文討論了其中的一些內容。 博客文章中顯示的方法遵循本書的以下引用:

通過交換相鄰的單個位,然后交換相鄰的2位字段等,可以非常有效地完成位反轉,如下所示。 這五個賦值語句可以按任何順序執行。

http://blog.sacaluta.com/2011/02/hackers-delight-reversing-bits.html

>>> def bit_rev(n):
...     return int(bin(n)[:1:-1], 2)
...
>>> bit_rev(2)
1
>>>bit_rev(10)
5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM