Skip to content

Commit

Permalink
Merge pull request #2519 from douniwan5788/reflect
Browse files Browse the repository at this point in the history
Reflect
  • Loading branch information
iceman1001 authored Sep 17, 2024
2 parents d46b074 + 1135304 commit c7af82f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 34 deletions.
48 changes: 14 additions & 34 deletions common/commonutil.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,39 +98,13 @@ uint8_t reflect8(uint8_t b) {
return (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;
}


// Reverse the bits in a byte with 4 operations (64-bit multiply, no division):
/*
uint8_t reflect8(uint8_t b) {
return ((b * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32;
}
*/

uint16_t reflect16(uint16_t b) {
uint16_t v = 0;
v |= (b & 0x8000) >> 15;
v |= (b & 0x4000) >> 13;
v |= (b & 0x2000) >> 11;
v |= (b & 0x1000) >> 9;
v |= (b & 0x0800) >> 7;
v |= (b & 0x0400) >> 5;
v |= (b & 0x0200) >> 3;
v |= (b & 0x0100) >> 1;

v |= (b & 0x0080) << 1;
v |= (b & 0x0040) << 3;
v |= (b & 0x0020) << 5;
v |= (b & 0x0010) << 7;
v |= (b & 0x0008) << 9;
v |= (b & 0x0004) << 11;
v |= (b & 0x0002) << 13;
v |= (b & 0x0001) << 15;
uint16_t reflect16(uint16_t v) {
v = (reflect8(v) << 8) | (reflect8(v >> 8) & 0xFF);
return v;
}

uint32_t reflect32(uint32_t b) {
uint32_t reflect32(uint32_t v) {
// https://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable
uint32_t v = b; // 32-bit word to reverse bit order
// swap odd and even bits
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
// swap consecutive pairs
Expand All @@ -140,17 +114,23 @@ uint32_t reflect32(uint32_t b) {
// swap bytes
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// swap 2-byte long pairs
v = (v >> 16) | (v << 16);
v = ( v >> 16 ) | ( v << 16);
return v;
}

uint64_t reflect64(uint64_t b) {
uint64_t reflect48(uint64_t v) {
uint64_t vhi = reflect16(v >> 32);
uint64_t vlo = reflect32(v);
v = (vlo << 32) | (vhi & 0xFFFF);
return v;
}

uint64_t reflect64(uint64_t v) {
// https://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable
uint64_t v = b; // 32-bit word to reverse bit order
// swap 2-byte long pairs
// swap 4-byte long pairs
uint64_t v1 = reflect32(v >> 32);
uint64_t v2 = reflect32(v);
v = (v1 << 32) | (v2 & 0xFFFFFFFF);
v = (v2 << 32) | (v1 & 0xFFFFFFFF);
return v;
}

Expand Down
1 change: 1 addition & 0 deletions common/commonutil.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ uint32_t reflect(uint32_t v, int b); // used in crc.c ...
uint8_t reflect8(uint8_t b); // dedicated 8bit reversal
uint16_t reflect16(uint16_t b); // dedicated 16bit reversal
uint32_t reflect32(uint32_t b); // dedicated 32bit reversal
uint64_t reflect48(uint64_t b); // dedicated 48bit reversal
uint64_t reflect64(uint64_t b); // dedicated 64bit reversal

void num_to_bytes(uint64_t n, size_t len, uint8_t *dest);
Expand Down

0 comments on commit c7af82f

Please sign in to comment.