比特扭曲黑客

时间:2016-11-10 14:10:02

标签: c bit-manipulation

任何人都可以帮助解释以下示例中val代表的内容吗?我完全不知道val的价值是什么。

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

uint8_t *page;
unsigned long val = SPLAT(page);

2 个答案:

答案 0 :(得分:7)

假设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;
}

作为输出:

8
101010101010101

答案 1 :(得分:0)

  • &#39; UL&#39;表示无符号长常数
  • (〜)按位补码运算符

假设sizeof(unsigned long) = 4,然后

~0UL = 0xffffffff, ~0UL / 255 = 0x01010101

假设*(p)= 0x5a,然后

0x5a * 0x01010101 = 0x5a5a5a5a