Last active
March 22, 2023 18:45
-
-
Save sr8e/46fd5d7099c8c1f5f914ba25cee8c37b to your computer and use it in GitHub Desktop.
bit-reversed increment sample. see: https://mell0w-5phere.net/jaded5phere/2023/03/23/bit-reversed-increment/
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
# bit-reversed increment sample. See: https://mell0w-5phere.net/jaded5phere/2023/03/23/bit-reversed-increment/ | |
import time | |
def bit_reverse_naive(bits): | |
table = [0 for _ in range(1 << bits)] | |
for i in range(1 << bits): | |
s = 0 | |
for j in range(bits): | |
if bits > 2 * j: | |
s += (i & (1 << j)) << (bits - 2 * j - 1) | |
else: | |
s += (i & (1 << j)) >> (2 * j - bits + 1) | |
table[i] = s | |
return table | |
def bit_reverse_naive2(bits): | |
table = [0 for _ in range(1 << bits)] | |
for i in range(1 << bits): | |
s = 0 | |
for j in range(bits): | |
if i & (1 << j): | |
s += 1 << (bits - j - 1) | |
table[i] = s | |
return table | |
def bit_reverse_recursive(bits): | |
table = [0 for _ in range(1 << bits)] | |
for i in range(bits): | |
for j in range(1 << i): | |
table[(1 << i) + j] = table[j] + (1 << (bits - i - 1)) | |
return table | |
def bit_reverse_xor(bits): | |
table = [0 for _ in range(1 << bits)] | |
s = 0 | |
m = 1 << bits | |
for i in range(1 << bits): | |
table[i] = s | |
s ^= m - m // (2 * (~i & (i + 1))) | |
return table | |
def bit_reverse_xor2(bits): | |
table = [0 for _ in range(1 << bits)] | |
s = 0 | |
m = 1 << bits | |
for i in range(1, 1 << bits): | |
s ^= m - m // (2 * (i & -i)) | |
table[i] = s | |
return table | |
def test_performance(bits, *func): | |
for f in func: | |
st = time.perf_counter() | |
revt = f(bits) | |
en = time.perf_counter() | |
print(f"{f.__name__} time: {en-st:.6f} sec.") | |
def out_binary_repl(table): | |
print("\n".join([f"{i:05b} -> {b:05b}" for i, b in enumerate(table)])) | |
test_performance( | |
20, | |
bit_reverse_naive, | |
bit_reverse_naive2, | |
bit_reverse_recursive, | |
bit_reverse_xor, | |
bit_reverse_xor2, | |
) | |
test_performance(25, bit_reverse_recursive, bit_reverse_xor, bit_reverse_xor2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment