2012-07-25 15 views
10

Dire che ho una raccolta di dati (ad es .: stringhe) che deve essere memorizzata in un file binario riempito in modo che ogni stringa sia, per esempio, allineata a 4 byte.Riempimento informatico necessario per l'allineamento di n byte

Quindi se avessi una stringa di lunghezza 11, si otterrebbe il riempimento a 12 (con byte null).
Se si dispone di una stringa di lunghezza 24, non è necessario alcun riempimento.
Se la mia stringa ha una lunghezza pari a 6, verrà riempita a 8 byte.

Come calcolare la quantità di riempimento richiesta in una singola espressione?

ho cercato 4 - (string_length % 4) ma fallisce quando la mia lunghezza della stringa è un multiplo di 4.

risposta

13

Questo sembra strano, ma dà la risposta giusta:

(4 - (string_length % 4)) % 4 
+0

Ah, mod il risultato. Non ci ho pensato. – MxyL

11

C'è un modo più veloce per calcolare l'imbottitura, se l'allineamento è una potenza di due (2,4,8, ...). Il seguente funziona perché il binario & è simile a% per le potenze di due: %(2^x) e &(2^x-1) fanno lo stesso per i numeri positivi. Attenzione: & cancellerà il bit di segno e quindi restituirà sempre il risultato positivo del modulo.

Quindi (4 - (string_length & 3)) & 3 farà lo stesso di (4 - (string_length % 4)) % 4. Usando la proprietà positiva del modulo, questo può essere semplificato in (-string_length) & 3!


Se si vuole aggiungere che risultato per la dimensione che si può anche fare di più ottimizzazioni:

padded_length = (string_length + 3) & ~3 semanticamente questo 'arrotonda' il numero per la dimensione imbottitura 4.

+1

Esiste un nome standard per questa tecnica? –

0
public static final int getByteAlignedIndex(final int pVariableDataIndex, final int pVariableDataLength, final int pByteAlignment) { 
    return pVariableDataIndex + (pVariableDataLength & 0xFFFFFFFC) + ((((pVariableDataLength & 0b1)|((pVariableDataLength & 0b10) >> 1))) << 2); 
} 
Problemi correlati