Concatenar números binarios de diferentes longitudes

Así que tengo 3 números. Uno es unchar, y los otros dos sonint16_t (también conocido comoshorts, pero de acuerdo con una tabla encontré que los cortos no serían confiables 16 bits).

Me gustaría concatenarlos juntos. Así que digamos que los valores de ellos fueron:

10010001

1111111111111101

1001011010110101

Me gustaría terminar con unalong long conteniendo:

1001000111111111111111011001011010110101000000000000000000000000

Usando algunas soluciones que he encontrado en línea, se me ocurrió esto:

long long result;
result = num1;
result = (result << 8) | num2;
result = (result << 24) | num3;

Pero no funciona; me da números muy extraños cuando se decodifica.

En caso de que haya un problema con mi código de decodificación, aquí está:

char num1 = num & 0xff;
int16_t num2 = num << 8 & 0xffff;
int16_t num3 = num << 24 & 0xffff;

¿Que está pasando aqui? Sospecho que tiene que ver con el tamaño de unlong long, pero no puedo rodearlo con la cabeza y quiero espacio para más números más adelante.

Respuestas a la pregunta(4)

Su respuesta a la pregunta