REPEAT_BYTE(x)宏

chr*_*hrk 4 c linux macros kernel linux-kernel

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

#define REPEAT_BYTE(x)  ((~0ul / 0xff) * (x))
Run Code Online (Sandbox Code Playgroud)

运行此示例后,我做了:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我已经弄清楚它的作用:它接收一个int介于0和之间255(包括它们),所以任何一个字节长int,并重复该字节.在查看输出时,这很明显(宏名称除外):

z = 12d (0xC)
REPEAT_BYTE(12d) = 868082074056920076d (0xC0C0C0C0C0C0C0C)
Run Code Online (Sandbox Code Playgroud)

但是,我仍然无法理解这个表达式是如何工作的:((~0ul / 0xff) * (x))我可以使用它的一些帮助.

非常感谢提前!

use*_*109 9

在64位机器上,~0ul0xffffffffffffffff.除以0xff你得到0x0101010101010101.乘以8位值,您可以将8位值重复8次.

  • `99999999 / 99 * x` 的十六进制版本 (2认同)