Skip to content

Instantly share code, notes, and snippets.

@TheGreatRambler
Created June 20, 2022 23:47
Show Gist options
  • Save TheGreatRambler/2a639b78d99657f6389d13a23e615eb5 to your computer and use it in GitHub Desktop.
Save TheGreatRambler/2a639b78d99657f6389d13a23e615eb5 to your computer and use it in GitHub Desktop.
Overengineered bit moving (right shifts only)
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