当前位置 博文首页 > dadalaohua的博客:【C语言笔记】【宏定义系列】 重复值

    dadalaohua的博客:【C语言笔记】【宏定义系列】 重复值

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

    【C语言笔记】【宏定义系列】 重复值

    宏定义系列内容。用于记录各式各样有用或者没用的宏定义?。

    宏定义说明

    用于将一个unsigned char类型的数值,以多次重复的形式,返回一个unsigned long类型的数值。

    例如unsigned char类型的数值为0x5f,如果使用平台的unsigned long类型长度为32位,那么返回的unsigned long类型的数值为0x5f5f5f5f。

    该宏定义来自linux kernel 5.10。

    实现代码

    #define REPEAT_BYTE(x)	((~0ul / 0xff) * (x))
    

    宏定义中:

    x表示要重复的值。

    注意x不能大于0xff,否者结果会出错,返回一个奇怪的数值。

    示例程序

    示例程序用于重复0x5f。

    int main(int argc, char* argv[])
    {
        unsigned char x;
        unsigned long y;
        
        x = 0x5f;
        y = REPEAT_BYTE(x);
        
        printf("0x%x REPEAT_BYTE 0x%lx\n", x, y);
        
        return 0;
    }
    

    实现过程

    1. ~0ul / 0xff

      先使用unsigned long类型的最大值去除以0xff。

      得到的结果,每8个bit的值都是1。如果使用的平台unsigned long类型长度为32位,那么会得到结果0x11111111。

    2. (~0ul / 0xff) * (x)

      第一步得到的数乘以x,因为每8个bit的值都是1,所以相乘之后,每8个bit的值都是x,也就是我们要的结果。

    [参考资料]

    linux kernel 5.10


    本文链接:https://blog.csdn.net/u012028275/article/details/118072194

    cs