Last active
November 1, 2017 14:27
-
-
Save xavierskip/c89604d084397ecb62f412147e6e6d65 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""实在是对位运算不熟,甚是麻烦,直接操作字符串了。 | |
""" | |
def test_rev_encode(): | |
for i in range(500): | |
encode = rev_encode(i) | |
if rev_encode(encode) != i: | |
print('{0}>{1} {1}>{2}'.format(i,encode,rev_encode(encode))) | |
def rev_encode(n): | |
bits = list(bin(n)[2:])[::-1] | |
odd = bits[::2] | |
even = bits[1::2][::-1] | |
for i, e in enumerate(even): | |
odd.insert(2*i+1,e) | |
return int('0b{}'.format(''.join(odd[::-1])),2) | |
def reverse32bits(n): | |
''' 32bit ''' | |
n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1) | |
n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2) | |
n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4) | |
n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8) | |
n = ((n & 0xFFFF0000) >> 16) | ((n & 0x0000FFFF) << 16) | |
return n | |
def encode(n): | |
# print bin(n) | |
odd = n & 0x55555555 | |
# print('odd', bin(odd)) | |
even = n & 0xAAAAAAAA | |
# print('even', bin(even)) | |
reverse_even = reverse32bits(even) | |
# print('reverse_even', bin(reverse_even)) | |
result = odd | reverse_even | |
# print bin(result) | |
return result | |
def odd_rev(n): | |
even = n & 0xAAAAAAAA | |
odd = n & 0x55555555 | |
odd = ((odd & 0x33333333) << 2) | ((odd & 0xCCCCCCCC) >> 2) | |
odd = ((odd & 0x0F0F0F0F) << 4) | ((odd & 0xF0F0F0F0) >> 4) | |
odd = ((odd & 0x00FF00FF) << 8) | ((odd & 0xFF00FF00) >> 8) | |
odd = ((odd & 0x0000FFFF) << 16) | ((odd & 0xFFFF0000) >> 16) | |
return even | odd | |
def even_rev(n): | |
even = n & 0xAAAAAAAA | |
odd = n & 0x55555555 | |
even = ((even & 0x33333333) << 2) | ((even & 0xCCCCCCCC) >> 2) | |
even = ((even & 0x0F0F0F0F) << 4) | ((even & 0xF0F0F0F0) >> 4) | |
even = ((even & 0x00FF00FF) << 8) | ((even & 0xFF00FF00) >> 8) | |
even = ((even & 0x0000FFFF) << 16) | ((even & 0xFFFF0000) >> 16) | |
return even | odd | |
def test_func(func, n): | |
for i in range(n): | |
encode = func(i) | |
if func(encode) != i: | |
print('{0}>{1} {1}>{2}'.format(i, encode, func(encode))) | |
if __name__ == '__main__': | |
test_func(even_rev, 1000000) |
我给个实现吧
def odd_rev(n):
even = n & 0xAAAAAAAA # 偶数位
odd = n & 0x55555555
odd = ((odd & 0x33333333) << 2) | ((odd & 0xCCCCCCCC) >> 2)
odd = ((odd & 0x0F0F0F0F) << 4) | ((odd & 0xF0F0F0F0) >> 4)
odd = ((odd & 0x00FF00FF) << 8) | ((odd & 0xFF00FF00) >> 8)
odd = ((odd & 0x0000FFFF) << 16) | ((odd & 0xFFFF0000) >> 16)
return even | odd
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
wow,好长。