不用大小写 写个宏定义求大数
2013-11-04 15:04
190 查看
1.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
这个题目很早了,网上有很多讨论
思路很多,看到其中有一个思路是 ((a+b)+abs(a-b))/2 就可以得到其中的大数了
确实很精彩,用数学方法,不过其中用到了abs函数
如果把abs函数也自定义了就好了
说干就干
写一个
int abs(int x)
{
return (((x>>31)&1)?(~x+1):x) //?:不算是if语句吧
}
解释一下
x>>31位,将符号位移到最右端(当前的int还是32位的....以前16,以后64或更高...)
考虑到如果是负数的话左边会补1而不是补0
屏蔽一下
(x>>32)&0x00000001
也就是(x>>32)&1
在C++里面,0为false,非0为true
当有符号(负数)时,条件为真,则应计算绝对值了,否则直接返回
对负数求相反数
首先要知道负数在计算机内部的表示是补码表示的
关于补码的知识,请查相关书籍,计算机相关课程应该介绍过了
取反+1得补码得相反数
(~x+1)
好了,将abs(x)替换到原式((a+b)+abs(a-b))/2
同时将a+b等都加上括号
得到最终得结果
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2
验证后,结果正确
补充一点:
max和min函数,用宏定义得经典实现
#define max(a,b) (a>b)?a:b
中,存在重复计算问题
比如
max(i++,j--)
这样的式子,展开后就.....
这个问题在我定义的max中同样存在着,
如果想避开这个问题,就用函数吧,
不过函数又存在类型检查的问题
你说:我用模板,
好了模板也有类型匹配和类型转换的问题
讨论到此为止,实现一个完美的max或者min函数不是那么简单的问题
在一些C++讨论区中有详细的讨论
还是用宏定义吧,使用时注意规则就是了.
再看看我们那个有些晕的宏哥哥
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2
这个题目很早了,网上有很多讨论
思路很多,看到其中有一个思路是 ((a+b)+abs(a-b))/2 就可以得到其中的大数了
确实很精彩,用数学方法,不过其中用到了abs函数
如果把abs函数也自定义了就好了
说干就干
写一个
int abs(int x)
{
return (((x>>31)&1)?(~x+1):x) //?:不算是if语句吧
}
解释一下
x>>31位,将符号位移到最右端(当前的int还是32位的....以前16,以后64或更高...)
考虑到如果是负数的话左边会补1而不是补0
屏蔽一下
(x>>32)&0x00000001
也就是(x>>32)&1
在C++里面,0为false,非0为true
当有符号(负数)时,条件为真,则应计算绝对值了,否则直接返回
对负数求相反数
首先要知道负数在计算机内部的表示是补码表示的
关于补码的知识,请查相关书籍,计算机相关课程应该介绍过了
取反+1得补码得相反数
(~x+1)
好了,将abs(x)替换到原式((a+b)+abs(a-b))/2
同时将a+b等都加上括号
得到最终得结果
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2
验证后,结果正确
补充一点:
max和min函数,用宏定义得经典实现
#define max(a,b) (a>b)?a:b
中,存在重复计算问题
比如
max(i++,j--)
这样的式子,展开后就.....
这个问题在我定义的max中同样存在着,
如果想避开这个问题,就用函数吧,
不过函数又存在类型检查的问题
你说:我用模板,
好了模板也有类型匹配和类型转换的问题
讨论到此为止,实现一个完美的max或者min函数不是那么简单的问题
在一些C++讨论区中有详细的讨论
还是用宏定义吧,使用时注意规则就是了.
再看看我们那个有些晕的宏哥哥
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2
相关文章推荐
- 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
- ACM竞赛中用到的取摸运算
- 设计模式资源总结---模式无处不在
- uva 1308 - Viva Confetti
- linux下如何使用sftp命令进行文件上传和下载
- linux下如何使用sftp命令进行文件上传和下载
- 关于JSP页面乱码的问题
- win7如何下启动telnet
- MyEclipse8下struts2开发例程及解析
- 面试经验
- MFC创建不规则窗口
- string,CString,char之间的转化
- java编译好的class文件如何在jsp页面中调用
- exe4j——打包java程序成exe
- 一键设置JDK环境变量
- Unix系统下的基于TCP通信的聊天室
- Eclipse常用设置
- Eclipse安装插件的两种方法
- Hello,JavaEye!
- hive 大数据 除重问题研究