| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 953 人关注过本帖
标题:还能再提升吗?
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
结帖率:94.64%
收藏
已结贴  问题点数:20 回复次数:11 
还能再提升吗?
在下课时没事做写了一个字符串转换大小写的程序如下图所示:
            
图片附件: 游客没有浏览图片的权限,请 登录注册

目的主要是想以最有效率的方法来实现大小写转换。算法如下:
'A'的ASCII值为 65    0x41    01000001
'a'的ASCII值为 97    0x61    01100001
'B'的ASCII值为 66    0x42    01000002
'b'的ASCII值为 98    0x62    01100002
'C'的ASCII值为 67    0x43    01000003
'c'的ASCII值为 99    0x63    01100003
......
可见转换为大写时,只要把第6位置0即可,转换小写则相反。
在VS2010下运行结果如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册

但是在转换时,字符串中包含有非字母字符时,不保证其完整性。
如:"Beautiful!" 在该字符串中,'\0'前的一个字符是'!',转换后可能'!'被换成了其它字符。

在这里的目的主要是想和大家讨论一下是否还有更高效率的方法来完成大小写的转换。
如有大虾相助,本人以分数致谢!

[ 本帖最后由 lz1091914999 于 2011-4-24 21:22 编辑 ]
搜索更多相关主题的帖子: 字符串 
2011-04-24 20:51
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
建议你看看 ctype.h
2011-04-24 21:03
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 2楼 voidx
你误会我的意思了,这个程序应用在一个字符串中,而不仅限于一个字符。而且位操作比算术操作的效率不是要高一点吗?
而且tolower和toupper对参数有了限制。

[ 本帖最后由 lz1091914999 于 2011-4-24 21:17 编辑 ]

My life is brilliant
2011-04-24 21:15
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:10 
几年前,我测过这个位运算方法的效率,基本上看不出来(和判断+加减法相比)什么优势。
实际应用中,这么一个地方就算快了一点点,也没有什么很大的意义。
如果真要效率,也不会仅仅这么实现,初级点的优化方式就是按照int来处理,而不是按照char来处理,高级点的内嵌汇编。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-04-24 21:17
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 4楼 卧龙孔明
我学过一点汇编,心里一直在想add必定是一个抽像。但是它用到的算法我却不知道,但位操作却更直观一点。

My life is brilliant
2011-04-24 21:20
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
肚子饿了,去吃宵夜了!

My life is brilliant
2011-04-24 21:24
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>
int main()
{
    char s[5] = "abcd";
    int i, * p = s;
    memset(&i, 32, 4);
    (*p) -= i;
    printf("%s\n", s);
    return 0;
}
2011-04-25 10:29
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
学习!!!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-25 11:01
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:10 
回复 5楼 lz1091914999
加法和位运算都是用硬件逻辑实现的,几乎没有速度上的区别。
实际上,只要指令的周期是一样的,实际跑时就不可能有速度上的区别。都花在时钟同步上了。

把 char 优化成 int 会快很多。就是因为一个 int 是 4 个 char,少做了 3/4 的运算。另外 cpu 解析 int 的机器指令也许多少会比 char 的快一些。


[ 本帖最后由 pangding 于 2011-4-25 14:33 编辑 ]
2011-04-25 14:31
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
其实想了想,我们编程的目的是为了解决某些问题,现在这个高速时代(除科学研究以外),对性能的要求不是太高了,而注重于程序的健壮性。在我所看的书籍中,外国程序员写的代码给我的感觉是很罗嗦,没有直接切入主题。而在国人写的书籍中,清晰的讲解了每个知识点,其中还包含一些算法的教学。但我却慢慢的习惯了罗嗦,觉得国人写的书籍不好阅读,外国人的代码中带着一丝幽默,比较符合我的性格。而且世界软件行业中,国人写的代码Bug最多,估计是在程序设计阶段没做好。在我身边的很多我认识的程序员都是直接写代码的。这个问题还得让我们国人好好想一想啊!

My life is brilliant
2011-04-25 19:34
快速回复:还能再提升吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018185 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved