WEB开发网
开发学院软件开发Java glibc中strlen的实现 阅读

glibc中strlen的实现

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 代码比较长,不过注释也比较详细,这里主要分析下两个位运算: Java代码 for(char_ptr=str;((unsignedlongint)char_ptr&(sizeof(longword)-1))!=0;++char_ptr)if(*char_ptr=='\0')retu

代码比较长,不过注释也比较详细,这里主要分析下两个位运算:

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的.所以这个表达式就刚好是我们所要的.

上一页  1 2 

Tags:glibc strlen 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接