计算n字节对齐所需的填充

MxL*_*evs 12 math

假设我有一个数据集合(例如:字符串)必须存储在填充的二进制文件中,以便每个字符串,例如,4字节对齐.

因此,如果我有一个长度为11的字符串,它将填充到12(使用空字节).
如果我有一个长度为24的字符串,则不需要填充.
如果我的字符串长度为6,则会填充为8个字节.

如何计算单个表达式中所需的填充量?

我试过4 - (string_length % 4)但是当我的字符串长度是4的倍数时它失败了.

Ned*_*der 15

这看起来很奇怪,但给出了正确的答案:

(4 - (string_length % 4)) % 4
Run Code Online (Sandbox Code Playgroud)


Joh*_*sie 15

如果对齐是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.

  • 这种技术有标准名称吗? (3认同)