#include <iostream>
#include <cstdint>
#include <bitset>
#include <cstring>
#include <algorithm>

struct bits
{
    unsigned sender : 16 ;
    unsigned res : 16 ;
    unsigned e : 12 ;
    unsigned f : 4 ;
};

int main()
{
    const bits b { 0xffff, 3, 2, 1 } ;

    const std::uint32_t res = b.res ;
    const std::uint32_t e = b.e ;
    const std::uint32_t f = b.f ;

    std::uint32_t buff = ( res << 16 ) | ( e << 4 ) | f ;
    // test it
    std::cout << std::bitset<32>(buff) << '\n' ;

    // copy it
    std::uint8_t byte_buff[4] ;
    std::memcpy( byte_buff, &buff, sizeof(buff) ) ;

    // check endianness
    for( std::uint8_t b : byte_buff ) std::cout << std::bitset<8>(b) << ' ' ;
    std::cout << '\n' ;

    // if needed, swap bytes
    std::swap( byte_buff[0], byte_buff[3] ) ;
    std::swap( byte_buff[1], byte_buff[2] ) ;

    for( std::uint8_t b : byte_buff ) std::cout << std::bitset<8>(b) << ' ' ;
    std::cout << '\n' ;
}
