百度面试题:自己实现strlen,考虑32位,64位机器,考虑性能
没办法, 现在的大公司面试就面这个, 你不得不研究下底层的实现.
要点:
1) 字长边界对齐以便加快速度. 对齐时也要考虑机器的位数哦.
如何一次测试4个字节是否含零? 一个关键技巧是通过异或操作判断经过运算后一个数的那些bit位未发生变化.结果为1的bit位未发生变化. 类似的,&操作可以判断那些位发生了变化. 举例,两个数a,b, 试比较两个数有那些bit位是相同的?
a^~b , 结果中bit位为1的位是相同的. a&~b , 结果中bit位为1的位是不同的.
一片博文讲解的很精彩
strlen高效实现
http://blog.csdn.net/lonelysky/article/details/6614422
#include <stdio.h>
#include <string.h>
int my_strlen(const char * str)
{
const char * pstr = str;
// 先将地址边界对齐 & 操作更高效, 避免了%取余运算
//for (; (unsigned long)pstr%(sizeof(long)) != 0; ++pstr)
for (; (unsigned long)pstr & (sizeof(long)-1) != 0; ++pstr)
{
if (pstr[0] == " ")
return pstr - str;
}
unsigned long himagic = 0x80808080;
unsigned long lomagic = 0x01010101;
// 如果是64位
if (sizeof(long) > 4)
{
himagic = ((himagic << 16) << 16) | himagic;
lomagic = ((lomagic << 16) << 16) | lomagic;
}
unsigned long longword = 0;
for (;; pstr+=sizeof(long))
{
longword = *(unsigned long*)pstr;
// (longword - lomagic) & ~longword 可测试出, 相减之后longword变量的那些bit发生了改变
// ... & himagic 可测试出, 变化的那些bit位中是否包含各个字节的最高位
if (((longword - lomagic) & ~longword & himagic) != 0)
{
if (pstr[0] == " ")
return pstr - str;
if (pstr[1] == " ")
return pstr - str + 1;
if (pstr[2] == " ")
return pstr - str + 2;
if (pstr[3] == " ")
return pstr - str + 3;
if (sizeof(long) > 4)
{
if (pstr[4] == " ")
return pstr - str + 4;
if (pstr[5] == " ")
return pstr - str + 5;
if (pstr[6] == " ")
return pstr - str + 6;
if (pstr[7] == " ")
return pstr - str + 7;
}
}
}
// never come to here...
return 0;
}
int main()
{
char * str = "helloworldaaaaa";
int ret = 0;
ret = my_strlen(str+1);
printf("len : %d
", ret);
ret = strlen(str+1);
printf("len : %d
", ret);
return 0;
}输出如下:
:!g++ -Wall -g strlen.cpp -o strlen && ./strlen
len : 14
len : 14
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: 关于对栈溢出的分析
- 下一篇:没有了
