2012-11-04 15 views
5

Quindi ho 3 numeri. Uno è un char e gli altri due sono int16_t (noto anche come short s, ma in base a una tabella che ho trovato i cortometraggi non saranno in modo affidabile 16 bit).Concatenare numeri binari di lunghezze diverse

Mi piacerebbe concatenarli insieme. Così dicono che i valori di loro sono stati:

10010001

1111111111111101

1001011010110101

mi piacerebbe finire con una long long contenente:

1001000111111111111111011001011010110101000000000000000000000000

Utilizzando alcune soluzioni che ho trovato online, I c con questo:

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

Ma non funziona; mi dà numeri molto strani quando è decodificato.

Nel caso in cui ci sia un problema con il mio codice di decodifica, eccolo:

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

cosa sta succedendo qui? Sospetto che abbia a che fare con le dimensioni di un long long, ma non riesco a pensarci bene e voglio spazio per altri numeri in seguito.

risposta

6

Per ottenere la corretta sequenza di bit come da voi richiesto, dovreste usare:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 
result<<=24; 

Questo produrrà il modello esatto bit che avete richiesto, 24 bit a LSB-estremità sinistra 0:

1001000111111111111111011001011010110101000000000000000000000000 
3

Per l'ultimo turno, si dovrebbe cambiare solo per 16, non per 24. 24 è la lunghezza corrente della stringa binaria, dopo la combinazione di num1 e num2. Hai bisogno di fare spazio per num3, che è di 16 bit, quindi spostamento a sinistra per 16.

Edit:

appena realizzato il primo turno è sbagliato troppo. Questo dovrebbe essere anche 16, per ragioni simili.

1

Sì, si sta traboccando il valore che può essere memorizzato a lungo. È possibile utilizzare una libreria di precisioni arbitrarie per memorizzare il numero grande come GMP.

+0

Vedrò quello, ma potrei pensare ad un approccio diverso (mettendo i numeri a destra invece di sinistra?) Perché i numeri semplici sono i più veloci. – Cheezey

+0

Sta usando 'long long', non' long'. 'long long' può memorizzare almeno 64 bit, ne ha solo bisogno 40. –

0

Se ho capito bene quello che stai facendo, vorrei utilizzare:

result = num1; 
result = (result << 16) | num2; 
result = (result << 16) | num3; 

num1out = (result >> 32) & 0xff; 
num2out = (result >> 16) & 0xffff; 
num3out = result & 0xffff; 

Lo spostamento a sinistra durante la costruzione è per la larghezza del numero successivo da inserire. Lo spostamento a destra dell'estrazione è per il numero totale di bit che il campo è stato lasciato spostato durante la costruzione.

Ho testato il codice sopra. long long è abbastanza largo per questo compito con il compilatore g ++, e credo che molti altri.

Problemi correlati