Created
June 20, 2022 23:47
-
-
Save TheGreatRambler/2a639b78d99657f6389d13a23e615eb5 to your computer and use it in GitHub Desktop.
Overengineered bit moving (right shifts only)
This file contains hidden or 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
uint64_t src = start + size; | |
uint64_t dest = new_start + size; | |
if(src % 8 != 0) { | |
uint8_t b = bytes[src >> 3] >> (8 - src % 8) & ((1UL << (src % 8)) - 1); | |
if(dest % 8 == 0) { | |
bytes[(dest >> 3) - 1] &= 0xFF << (src % 8); | |
bytes[(dest >> 3) - 1] |= b; | |
// std::cout << "1" << std::endl; | |
} else if(dest % 8 >= src % 8) { | |
bytes[dest >> 3] &= ~(((1UL << (src % 8)) - 1) << (8 - dest % 8)); | |
bytes[dest >> 3] |= b << (8 - dest % 8); | |
// std::cout << "2" << std::endl; | |
} else { | |
bytes[dest >> 3] &= ((1UL << (8 - dest % 8)) - 1); | |
bytes[dest >> 3] |= b << (8 - dest % 8); | |
bytes[(dest >> 3) - 1] &= 0xFF << (src % 8 - dest % 8); | |
bytes[(dest >> 3) - 1] |= b >> (dest % 8); | |
// std::cout << "3" << std::endl; | |
} | |
dest -= src % 8; | |
src -= src % 8; | |
} | |
// Destination bitmasks | |
const uint8_t dest_bits_right = dest % 8; | |
const uint8_t dest_mask_right_noshift = ((1UL << dest_bits_right) - 1); | |
const uint8_t dest_mask_right = dest_mask_right_noshift << (8 - dest_bits_right); | |
const uint8_t dest_mask_left = (1UL << (8 - dest_bits_right)) - 1; | |
while(src - start != 0) { | |
uint8_t b = bytes[(src >> 3) - 1]; | |
if(src - start > 8) { | |
bytes[dest >> 3] &= dest_mask_left; | |
bytes[dest >> 3] |= b << (8 - dest_bits_right); | |
bytes[(dest >> 3) - 1] &= dest_mask_right; | |
bytes[(dest >> 3) - 1] |= b >> dest_bits_right & dest_mask_left; | |
src -= 8; | |
dest -= 8; | |
} else { | |
if(dest % 8 == 0) { | |
uint8_t mask = 0xFF << (src - start); | |
bytes[(dest >> 3) - 1] &= mask; | |
bytes[(dest >> 3) - 1] |= b & ((1UL << (src - start)) - 1); | |
} else if(dest % 8 >= src - start) { | |
uint8_t mask = ~(((1UL << (src - start)) - 1) << (8 - dest % 8)); | |
bytes[dest >> 3] &= mask; | |
bytes[dest >> 3] |= (b & ((1UL << (src - start)) - 1)) << (8 - dest % 8); | |
} else { | |
bytes[dest >> 3] &= dest_mask_left; | |
bytes[dest >> 3] |= b << (8 - dest_bits_right); | |
bytes[(dest >> 3) - 1] &= 0xFF << (src - start - dest % 8); | |
bytes[(dest >> 3) - 1] |= b >> (dest % 8) & ((1UL << (src - start - dest % 8)) - 1); | |
} | |
break; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment