当前位置 博文首页 > dadalaohua的博客:【C语言笔记】【宏定义系列】 向上取整到指定

    dadalaohua的博客:【C语言笔记】【宏定义系列】 向上取整到指定

    作者:[db:作者] 时间:2021-07-11 10:08

    【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;
    }
    

    实现过程

    1. typeof(y) __y = y

      使用一个与参数y相同数据类型的临时变量__y来保存参数y的值,避免类似自增或自减带来的影响。

    2. (((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

    cs