2012-07-25 7 views
10

私は、各ストリングが、例えば4バイト境界になるようにパディングされたバイナリファイルに格納されなければならないデータの集合(例えば、文字列)があるとします。nバイトアライメントに必要な計算用埋め込み

したがって、長さが11の文字列を使用すると、12(ヌルバイト)で埋められます。
長さが24の文字列がある場合、パディングは必要ありません。
文字列の長さが6の場合、8バイトにパディングされます。

1つの式で必要なパディングの量を計算するにはどうすればよいですか?

私は4 - (string_length % 4)を試してみましたが、それは私の文字列の長さが4

答えて

13

の倍数であるとき、これは奇妙に見えるが、右の答え与え失敗:パディングを計算するより高速な方法はあり

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

ああのパディングサイズに番号を「切り上げ」結果を修正する。それを考えなかった。 – MxyL

11

を、アライメントが2の累乗(2,4,8、...)の場合バイナリ&は、2の累乗で%と似ているため、次のように動作します。%(2^x)&(2^x-1)は正の数で同じです。注意:&は符号ビットを削除するため、常に正のモジュロ結果を返します。

したがって(4 - (string_length & 3)) & 3(4 - (string_length % 4)) % 4と同じになります。正のモジュロプロパティを使用すると、これを簡略化して (-string_length) & 3にすることができます!


あなたはさらに多くの最適化を行うことができますサイズにその結果を追加したい場合は、次の

padded_length = (string_length + 3) & ~3意味的にこれは、4

+1

この手法の標準名はありますか? –

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); 
} 
関連する問題