比特扭曲黑客

Hua*_*Jie -2 c bit-manipulation

任何人都可以帮助解释val以下示例中的含义吗?我完全不知道它的价值是什么val.

#define SPLAT(p)       (*(p) * (~0UL / 255))

uint8_t *page;
unsigned long val = SPLAT(page);
Run Code Online (Sandbox Code Playgroud)

Hen*_*nry 7

假设a long是32位.~0UL是所有1的位模式,即0xffffffff.现在除以255或0xff给出0x01010101.

将其乘以8位数量,您将获得相同的字节4次; 例如0x5a*0x01010101 = 0x5a5a5a5a.

这个工作独立于long的大小,long的所有字节都填充了原始字节.

例如,8字节长:

#include <stdio.h>

int main() {
    printf("%lu\n", sizeof(long));
    printf("%lx\n", (~0UL / 255));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

8
101010101010101
Run Code Online (Sandbox Code Playgroud)