我在/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;
}
我已经弄明白它的作用:它在int
和0
之间收到255
(包括它们),因此任何一个字节长int
,它重复那个字节。在查看输出时,这很明显(宏名称除外):
z = 12d (0xC)
REPEAT_BYTE(12d) = 868082074056920076d (0xC0C0C0C0C0C0C0C)
但是,我仍然无法理解 这个表达式是如何工作的:((~0ul / 0xff) * (x))
,我可以使用它的一些帮助。
提前多多感谢!
答案 0 :(得分:9)
在64位计算机上,~0ul
为0xffffffffffffffff
。将其除以0xff
,即可获得0x0101010101010101
。乘以8位值,您将8位值重复8次。