如何将值与给定的对齐方式对齐

时间:2012-10-04 06:51:30

标签: c++ math

我有一个值,我希望与给定的对齐对齐,即如果尚未对齐,则将值增加到对齐的下一个倍数。

在C ++中用简洁的方法做什么?

例如

int x;
int alignment;
int y = ???; // align x to alignment

3 个答案:

答案 0 :(得分:11)

让我们说对齐是a

---(k-1)a-----------x--------------ka---------
         <----r----><-----(a-r)--->

其中k是一个整数(因此ka是对齐的倍数)

首先找到余数

r = x%a

然后将x增加到下一个多次

y = x + (a-r)

但如果r = 0,那么y = x

最后

r = x%a;
y = r? x + (a - r) : x;

答案 1 :(得分:0)

如果对齐方式是2的幂,并且机器对负数使用2的补数,则:

mask = alignment - 1;
aligned_val = unaligned_val + (-unaligned_val & mask);

答案 2 :(得分:0)

在我的摘录库中:

template <typename I=size_t>
inline I IntAlign( I sz, I step=16,  I min=16  ) {
  auto s = std::max(sz+step-1,min);
  return s - s%step;
}

这很简单,所以... 这是测试代码的一部分:

TEST(Sz,Basic) {
  EXPECT_EQ( 16U, IntAlign(0U) );
  EXPECT_EQ( 16U, IntAlign(1U) );
  EXPECT_EQ( 8U, IntAlign(5U,8U,8U) );
  EXPECT_EQ( 8U,  IntAlign(7U,8U,8U) );
  EXPECT_EQ( 64U,  IntAlign(7U,8U,64U) );

  EXPECT_EQ( 16, IntAlign(0) );
  EXPECT_EQ( 16, IntAlign(1) );
  EXPECT_EQ( 8, IntAlign(8,8,8) );
  EXPECT_EQ( 8,  IntAlign(7,8,8) );
  EXPECT_EQ( 64,  IntAlign(7,8,64) );
}

注意!
从用例中添加测试,并在需要时进行修复。 没有保证!