对于一个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; }
|