【问题标题】:How do I round to the next 32-bit alignment?如何舍入到下一个 32 位对齐?
【发布时间】:2015-07-07 15:56:20
【问题描述】:

来自网络的数据包在末尾添加了填充字节以进行对齐。我想跳过这些字节,但数据包大小是可变的但已知的。给定一个数字n,如何将其四舍五入到下一个 4 字节对齐?

【问题讨论】:

标签: c++ alignment


【解决方案1】:

另一个版本。 n 是你想下车到 4 的数字(比如 k)。公式为=n+k-n%k(其中 % 是模数)

例如(在 Unix bc 计算器中)

k=4
n=551
n+k-n%k
552

检查它是否对齐:

scale=4
552/4
138.0000

【讨论】:

  • 如果 n 已经对齐,这会增加一个额外的 k:例如n=4; k=4; 4+4-(4%4)= 8,而不是 4。如果您首先检查 n%k != 0,它会起作用,但是在某些代码中,采用分支会受到惩罚,并且首选 @Kerrek SB 的解决方案。跨度>
【解决方案2】:

对于任何整数n 和任何步幅k(均为正数),您可以通过以下方式计算不小于nk 的最小倍数:

(n + k - 1) / k * k

这使用了整数除法截断的事实。

【讨论】:

  • 所以对于 4 字节对齐,它将是 (n + 32 - 1) / 32 * 32?
  • @templateboy:如果您按位计算,是的,尽管这不太可能。您可能应该以字节为单位,即最小可分配(因此可对齐)存储单元的大小。
猜你喜欢
  • 2016-12-18
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2013-08-21
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
相关资源
最近更新 更多