随笔-89  评论-224  文章-23  trackbacks-0
   原为某著名软件公司试题,大意如下:请实现以下两个函数:char toupper(char c); char tolower(char c); 分别用于将传入的字母转为大写和小写。两个函数传入的参数取值范围都是[a-zA-Z],并且为ASCII编码,实现时不用检查参数合法性。两个函数的实现不能使用任何形式的分支、跳转等类型的语句或指令(特别说明:C/C++的条件操作符?:也是分支指令的一种形式,故而不能使用)。请尽可能多的写出你知道的办法。   

  分析解决:此题比较特别,限制严格,根据题目要求,排除if else、for、while、do while、switch case、?:外,能使用的语句就只有 =、+=、-=、&、|、^、++、--这些了,想要实现大小写转换,只能从这些语句中进行选择思考,由于字符集为ASCII编码,且范围明确为[a-zA-Z],我们知道,a-z对应ASCII值为97-122,A-Z对应ASCII为65-90,观察这些数字,可以发现97-122都大于96 ,65-90都大于64且小于96,进一步从二进制上考虑,则发现所有小写字母对应的二进制形式为011XXXXX,大写字母对应的二进制形式为010XXXXX,一到这里,哈哈,答案就出来了,通过位运算&和|就可实现了。代码描述如下
 1 char toupper(char c)
 2 {
 3     return c & 0x5F;
 4 }

 5 
 6 char tolower(char c)
 7 {
 8     //c | 0x60也行,但不太好,因为0x60会改变结果的第7位值,根据题目意思,改变第6位值为1,而其它位保持不变就够了。
 9     return c | 0x20;
10}
   至于其它方法,我就没多想了,还希望各位大侠多多分享一下哈。
posted on 2011-06-25 12:13 春秋十二月 阅读(2714) 评论(7)  编辑 收藏 引用 所属分类: Algorithm

评论:
# re: 字符大小写转换 2011-06-25 12:26 | 千暮(zblc)
mark.  回复  更多评论
  
# re: 字符大小写转换 2011-06-25 15:39 | 路人
看过王爽汇编的都知道  回复  更多评论
  
# re: 字符大小写转换 2011-06-25 16:49 | wangofjian
精炼,转载  回复  更多评论
  
# re: 字符大小写转换 2011-06-25 18:42 | hi
char toUppper(char a)
{
return a+'A'-'a';
}  回复  更多评论
  
# re: 字符大小写转换 2011-06-25 19:11 | 空明流转
唉。这尼玛都是从来不顾及LOCALE的。。。  回复  更多评论
  
# re: 字符大小写转换 2011-06-25 22:57 | megax
@空明流转
这个很重要!  回复  更多评论
  
# re: 字符大小写转换 2011-06-27 11:35 | haohao06
return "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[a - 'a'];  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理