glibc中strlen的实现
2009-09-10 00:00:00 来源:WEB开发网代码比较长,不过注释也比较详细,这里主要分析下两个位运算:
Java代码
for (char_ptr = str; ((unsigned long int) char_ptr
& (sizeof (longword) - 1)) != 0;
++char_ptr)
if (*char_ptr == '\0')
return char_ptr - str;
这里是做一个循环来判断4-byte对齐的那个地址,这里一般的编译器传递进来的字符串指针都是4-byte对其的,因此这步在很多编译器都是跳过的.
下来来看如何在4字节的数字中判断是否有某个字节为0.
Java代码
himagic = 0x80808080L;
lomagic = 0x01010101L;
if (((longword - lomagic) & ~longword & himagic) != 0)
这里分两个部分看.
第一部分(longword - lomagic) 这个表达式是用来判断最高位的,它的意思是: 如果longword的任何一个字节如果大于0x80或者等于0的情况下,它的这个字节的最高位的值都会是不等于0的.
第二部分(~longword & himagic)这个表达式是用来判断longword的每个字节的最高位的设置,也就是判断longword是否小于0x80,如果小于0x80则这个表达式的值是himagic(0x80808080).否则就是0.
因此这两部分合并起来刚好就是如果longword的某个字节小于0x80,并且某个字节为0,则整个表达式的值不为0.
而我们知道传进来的字符串的每个字符的大小的ascii码的范围就是[0,127],也就是肯定是小于0x80的.所以这个表达式就刚好是我们所要的.
更多精彩
赞助商链接