【问题标题】:REPEAT_BYTE(x) macroREPEAT_BYTE(x) 宏
【发布时间】:2014-05-21 21:16:34
【问题描述】:

我正在查看 /usr/src/linux-headers-3.11-.../include/linux/kernel.h 头文件中的代码,我偶然发现了这个宏(第 47 行):

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

运行这个例子后我做了:

#include <stdio.h>

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

int main(void)
{
        long z = 12;    
        fprintf(stderr, "\tz = %ldd (0x%lX)\n"
                        "\tREPEAT_BYTE(%ldd) = %ldd (0x%lX)\n",
                        z, z, z, REPEAT_BYTE(z), REPEAT_BYTE(z));
        return 0;
}

我已经弄清楚它的作用:它在0255(包括它们)之间接收一个int,所以任何一个字节长的int,它都会重复那个字节。查看输出时,这一点很明显(宏名称除外):

z = 12d (0xC)
REPEAT_BYTE(12d) = 868082074056920076d (0xC0C0C0C0C0C0C0C)

但是,我仍然无法理解 这个表达式是如何工作的:((~0ul / 0xff) * (x)),我需要一些帮助。

提前非常感谢!

【问题讨论】:

    标签: c linux macros linux-kernel kernel


    【解决方案1】:

    在 64 位机器上,~0ul0xffffffffffffffff。将其除以0xff,得到0x0101010101010101。乘以一个 8 位值,您会得到该 8 位值重复 8 次。

    【讨论】:

    • 看到答案后,数学问题总是很容易:)
    • 99999999 / 99 * x的十六进制版本
    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多