加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

不用大小写 写个宏定义求大数

发布时间:2020-12-14 03:56:35 所属栏目:大数据 来源:网络整理
导读:1.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 这个题目很早了,网上有很多讨论 思路很多,看到其中有一个思路是 ((a+b)+abs(a-b))/2 就可以得到其中的大数了 确实很精彩,用数学方法,不过其中用到了abs函数 如果把abs函数也自定义了就好
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读