0%

CSAPP chapter1 笔记

对于一个32位的16进制数来说,我们怎么知道它的哪一位是不是字母
将结果的每一位用0或1表示
例如 0x13423aba 只有最后三位是字母
答案就是00000111

可以将十六进制表示的每一位的拆分成4个二进制数
观察表可以发现只有当x3 = 1 并且 x1 或 x2 等于 1时,这一位才是1
即 $ x3 \wedge (x1 \vee x2) $

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

unsigned Letter(unsigned x) {
unsigned x1 = x & 0x22222222;
unsigned x2 = x & 0x44444444;
unsigned x3 = x & 0x88888888;
return (x3>>3) & ((x2>>2) | (x1 >> 1));
}

int main() {
printf("0x%x is letter %x\n", 0xb234567a, Letter(0xb234567a));

return 0;
}

求大佬赏个饭