我有一个值,我希望与给定的对齐对齐,即如果尚未对齐,则将值增加到对齐的下一个倍数。
在C ++中用简洁的方法做什么?
例如
int x;
int alignment;
int y = ???; // align x to alignment
答案 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) );
}
注意!
从用例中添加测试,并在需要时进行修复。 没有保证!