免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8687 | 回复: 14
打印 上一主题 下一主题

c语言比较数据大小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-15 19:57 |只看该作者 |倒序浏览
有两个整形数据a,b,现在要求不使用条件判断语句,三目运算符,怎样找到a,b中较大(小)的

论坛徽章:
0
2 [报告]
发表于 2012-03-15 20:07 |只看该作者


  1. #include <stdio.h>
  2. #include <stdio.h>
  3. int main () {
  4.         int a , b ;
  5.         scanf ("%d%d" , &a , &b) ;
  6. #define L (sizeof(int)*8-1)
  7. #define LARGER(x) (x)
  8. #define SMALLER(x) (1-(x))
  9.         printf ("%d\n" , SMALLER((a-b)>>L&1)*b+SMALLER((b-a)>>L&1)*a);
  10. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-03-15 20:37 |只看该作者
回复 2# hbmhalley
谢谢你的帮助 ,这是我的理解:
通过判断差值的符号位进行判断,
宏定义 L 可以得到当前环境中的int所占的位数,对其减1得到从而可以得知移动多少位可以得到符号位
a-b 如果结果为负数,则符号位为1,从而与运算结果为1, SMALLER(X) 结果为0
相反 b-a为正数,从而得到的结果为 a;


   

论坛徽章:
0
4 [报告]
发表于 2012-03-15 21:12 |只看该作者
回复 3# 天空的期望


    right

论坛徽章:
0
5 [报告]
发表于 2012-03-15 22:14 |只看该作者
回复 2# hbmhalley


    设a=INT_MAX, b=INT_MIN, 结果正确么?

论坛徽章:
0
6 [报告]
发表于 2012-03-16 08:01 |只看该作者
回复 5# ithinc


    |a|,|b|<=~0U>>2

论坛徽章:
17
2015年辞旧岁徽章
日期:2015-03-03 16:54:152017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:19:56JAVA
日期:2016-11-01 13:25:46C
日期:2016-10-25 16:01:4715-16赛季CBA联赛之八一
日期:2016-06-21 23:38:0815-16赛季CBA联赛之山东
日期:2016-05-12 12:49:54IT运维版块每日发帖之星
日期:2016-04-20 06:20:00IT运维版块每日发帖之星
日期:2016-03-22 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-08-25 06:20:002015亚冠之德黑兰石油
日期:2015-08-22 22:55:54
7 [报告]
发表于 2012-03-16 09:47 |只看该作者
移位运算

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2012-03-16 10:40 |只看该作者
没实际意义

论坛徽章:
0
9 [报告]
发表于 2012-03-16 11:27 |只看该作者
本帖最后由 ithinc 于 2012-03-16 11:49 编辑

支持溢出。

  1. #define SIGN(x) ((x) >> (sizeof(x) * 8 - 1) & 1)
  2. #define MAX(x, y) \
  3. (!(!(SIGN(x) ^ SIGN(y)) * SIGN(x - y) + (SIGN(x) ^ SIGN(y)) * SIGN((x>>1) - (y>>1))) * x + \
  4. (!(SIGN(x) ^ SIGN(y)) * SIGN(x - y) + (SIGN(x) ^ SIGN(y)) * SIGN((x>>1) - (y>>1))) * y)
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-03-16 12:22 |只看该作者
C99写法:

  1. #define SIGN(x) ((x) >> (sizeof(x) * 8 - 1) & 1)
  2. #define MAX(x, y) (((int[]){x, y})[((int[]){SIGN(x - y), SIGN((x>>1) - (y>>1))})[SIGN(x) ^ SIGN(y)]])
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP