百度面试题:自己实现strlen,考虑32位,64位机器,考虑性能
来源:互联网 发布:网络歌手想你的感觉 编辑:程序博客网 时间:2024/06/07 17:53
没办法, 现在的大公司面试就面这个, 你不得不研究下底层的实现.
要点:
1) 字长边界对齐以便加快速度. 对齐时也要考虑机器的位数哦.
2) 一次测试4个(或者8个)字节中是否含零的技巧.
3) 需要自适应32bit/64bit机器.
定义magic变量是要使用long, 并且是unsigned的, 如果是unsigned int就不行, 只能在32位下用.
判断字长时要sizeof(long) 而不是sizeof(int)
如何一次测试4个字节是否含零?
一个关键技巧是通过异或操作判断经过运算后一个数的那些bit位未发生变化.结果为1的bit位未发生变化.
类似的,&操作可以判断那些位发生了变化.
举例,两个数a,b, 试比较两个数有那些bit位是相同的?
a^~b , 结果中bit位为1的位是相同的.
a&~b , 结果中bit位为1的位是不同的.
一片博文讲解的很精彩
strlen高效实现
http://blog.csdn.net/lonelysky/article/details/6614422
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] == '\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] == '\0') return pstr - str; if (pstr[1] == '\0') return pstr - str + 1; if (pstr[2] == '\0') return pstr - str + 2; if (pstr[3] == '\0') return pstr - str + 3; if (sizeof(long) > 4) { if (pstr[4] == '\0') return pstr - str + 4; if (pstr[5] == '\0') return pstr - str + 5; if (pstr[6] == '\0') return pstr - str + 6; if (pstr[7] == '\0') 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\n", ret); ret = strlen(str+1); printf("len : %d\n", ret); return 0; }
输出如下:
:!g++ -Wall -g strlen.cpp -o strlen && ./strlen
len : 14
len : 14
- 百度面试题:自己实现strlen,考虑32位,64位机器,考虑性能
- Ubuntu考虑停止支持32位处理器
- 剑指offer面试题47不用加剑乘除做加法,考虑加法的过程用位运算
- 32位程序移植到64位需要考虑的问题
- 32位程序移植到64位需要考虑的问题
- 32位程序移植到64位需要考虑的问题
- 32位程序移植到64位需要考虑的问题
- 32位程序移植到64位需要考虑的问题
- sizeof 和 strlen (32位.64位)
- 性能考虑
- 32位机器 64位 机器
- 32位机器和64位机器
- 如何查看自己的电脑是32位机器还是64位机器
- 用js实现下列功能,将给定的数字转化为千分位的格式,如把"10000"转化为"10,000",并考虑性能方面的因素
- 面试题-位操作
- 面试题:位操作
- 2015百度面试题--对10亿个32位整数去重和排序
- 64位机器装32位Win7
- UVA 296 - Safebreaker
- 实验一 简单Java程序设计
- setjmp和longjmp函数使用详解
- [leetcode] word ladder
- extjs4 form.Panel
- 百度面试题:自己实现strlen,考虑32位,64位机器,考虑性能
- BufferedImage互换byte
- C与PHP速度对比
- D3.JS 基于javascript的图表展示库<二>----基本元素操作
- Live555对于将ES流封装成TS文件的部分代码
- PPT 、word 、pdf、 txt 格式转换
- linux挂载移动硬盘乱码
- RHEL iptables防火墙开启端口
- ListView相关知识点