Skip to content

Instantly share code, notes, and snippets.

@xavierskip
Last active November 1, 2017 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save xavierskip/c89604d084397ecb62f412147e6e6d65 to your computer and use it in GitHub Desktop.
Save xavierskip/c89604d084397ecb62f412147e6e6d65 to your computer and use it in GitHub Desktop.
"""实在是对位运算不熟,甚是麻烦,直接操作字符串了。
"""
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)
@comzyh
Copy link

comzyh commented Dec 28, 2016

wow,好长。

@comzyh
Copy link

comzyh commented Dec 28, 2016

我给个实现吧

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

@xavierskip
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment