There is a built in function called __builtin_avr_insert_bits which will rearrange the bits for you.
A brief example:
// from avrfreaks.net https://www.avrfreaks.net/comment/204080#comment-204080
// post #17
// https://gcc.gnu.org/onlinedocs/gcc/AVR-Built-in-Functions.html
void setup() {
Serial.begin(115200);
delay(100);
uint8_t argument = 0x8f;
Serial.println("\n\n");
Serial.print(argument, BIN);
Serial.print("\t");
Serial.println(argument, HEX);
Serial.println("swapped nybbles");
// use AVR-provided function to reverse bits
// Example: if map = 0xffff0123, upper four bits are unchanged,
// bit order of lower four bits is reversed.
// 2nd and 3rd function parameters can be different variables
// argument = __builtin_avr_insert_bits (0xffff0123, argument, argument);
// Serial.println(argument, BIN);
// swap nybbles using 'insert_bits'
argument = __builtin_avr_insert_bits (0x32107654, argument, argument);
Serial.print(argument, BIN);
Serial.print("\t");
Serial.print(argument, HEX);
}
void loop() {}