14

たとえば、各文字列が4バイトに整列されるように、パディングされたバイナリファイルに格納する必要のあるデータのコレクション(文字列など)があるとします。

したがって、長さが11の文字列がある場合、12(nullバイト)にパディングされます。
長さ24の文字列がある場合、パディングは必要ありません。
文字列の長さが6の場合、8バイトにパディングされます。

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

試し4 - (string_length % 4)ましたが、文字列の長さが4の倍数になると失敗します。

4

3 に答える 3

20

これは奇妙に見えますが、正しい答えを与えます:

(4 - (string_length % 4)) % 4
于 2012-07-25T03:23:18.410 に答える
17

配置が2の累乗(2、4、8、...)の場合、パディングを計算するためのより高速な方法があります。2進数の&は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に「切り上げ」ます。

于 2012-12-18T17:32:59.783 に答える
-2
public static final int getByteAlignedIndex(final int pVariableDataIndex, final int pVariableDataLength, final int pByteAlignment) {
    return pVariableDataIndex + (pVariableDataLength & 0xFFFFFFFC) + ((((pVariableDataLength & 0b1)|((pVariableDataLength & 0b10) >> 1))) << 2);
}
于 2014-10-01T12:43:05.600 に答える