【C语言笔记】【宏定义系列】 向上取整到指定数值的倍数
宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。
宏定义说明
用于将一个数向上取整到大于等于该数的指定数值的倍数。
例如一个要向上取整的数是66,指定的数值为10,那么最后得到的数就是10的倍数,66向上取整就是70。
例如一个要向上取整的数是1066,指定的数值为100,那么最后得到的数就是100的倍数,1066向上取整就是1100。
例如一个要向上取整的数是1066,指定的数值为20,那么最后得到的数就是20的倍数,1066向上取整就是1080。
该宏定义来自linux kernel 5.10。
实现代码
#define roundup(x, y) ( \
{ \
typeof(y) __y = y; \
(((x) + (__y - 1)) / __y) * __y; \
} \
)
宏定义中:
x表示要向上取整的数值。
y表示的是用于取整倍数的指定数值。
也就是将x向上取整为大于等于x的y的倍数。
示例程序
示例程序用于得到1066向上取整100的倍数和20的倍数的情况,最后结果为1100和1080。
int main(int argc, char* argv[])
{
int x, y;
x = 1066;
y = 100;
printf("roundup : %d\n", roundup(x, y));
x = 1066;
y = 20;
printf("roundup : %d\n", roundup(x, y));
return 0;
}
实现过程
-
typeof(y) __y = y
使用一个与参数
y
相同数据类型的临时变量__y
来保存参数y
的值,避免类似自增或自减带来的影响。 -
(((x) + (__y - 1)) / __y) * __y
该行代码写成公式就是 ( x + ( y − 1 ) ) y × y \frac{(x+(y-1))}{y} \times y y(x+(y−1))×y
1)先计算
(x) + (__y - 1)
,我们假设向上取整的数值为n × y
,是y的n倍,假设得到的数值为k, 那么得到的数值k的范围将是n × y ≤ k < (n + 1) × y
,大于等于向上取整的数值,小于指定数值与取整倍数加1相乘的数。2) 然后
/ __y
,得到的数除以y,得到的就是倍数。3)然后倍数乘以y,就得到了向上取整的数。
[参考资料]
linux kernel 5.10
本文链接:https://blog.csdn.net/u012028275/article/details/118068412