试着练习一下
37 /* Handle the first few characters by reading one character at a time.
38 Do this until CHAR_PTR is aligned on a longword boundary. */
39 for (char_ptr = str; ((unsigned long int) char_ptr
40 & (sizeof (longword) - 1)) != 0;
41 ++char_ptr)
42 if (*char_ptr == '\0')
43 return char_ptr - str;
这边注解写的很清楚
把 char pointer 对齐到 long* 的位置
这样之后我们一次就可以比一个 long
59 magic_bits = 0x7efefeffL;
60 himagic = 0x80808080L;
61 lomagic = 0x01010101L;
62 if (sizeof (longword) > 4)
63 {
66 magic_bits = ((0x7efefefeL << 16) << 16) | 0xfefefeffL;
67 himagic = ((himagic << 16) << 16) | himagic;
68 lomagic = ((lomagic << 16) << 16) | lomagic;
69 }
70 if (sizeof (longword) > 8)
71 abort ();
magic number 先跳过
不过方便起见之后假设 long 是 4B
76 for (;;)
77 {
107 longword = *longword_ptr++;
这个跟你的写法差不多
不过他现在就是要一次比 4B
108
109 if (
122 ((longword - 0x01010101) & 0x80808080)
124 != 0)
125 {
整个程式里面神奇的只有这个
我把 magic number 展开了
如果 4B 里面有 0
那么每个 byte 减掉 1 的时候就会退位
导致该 byte 前面的 byte 的 MSB 是 1
128
129 const char *cp = (const char *) (longword_ptr - 1);
130
131 if (cp[0] == 0)
132 return cp - str;
133 if (cp[1] == 0)
134 return cp - str + 1;
(下略)
承上
会进来这边就是他认为这 4B 里面有可能 0x00
这边就是把 loop 展开