免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HappyWin

不用判断语句,求两个数的最大值  关闭 [复制链接]

论坛徽章:
0
发表于 2004-10-12 19:26 |显示全部楼层

不用判断语句,求两个数的最大值


  1. int
  2. main ()
  3. {
  4.         int x, y;

  5.         x = 0x7fffffff;
  6.         y = 0x80000000;
  7.         printf ("max of %d, %d is %d\n", x, y, max (x, y));
  8. }

  9. int
  10. max (int x, int y)
  11. {
  12.         int buf[2] = { x, y };
  13.         unsigned int z;
  14.         int c;

  15.         z = x - y;
  16.         c = x - y;
  17.         z >;>;= 31;
  18.         z = ((x - c - y) && 1) ^ z;

  19.         return buf[z];
  20. }
复制代码


上面是我对 A0110A  第三个版本写的测试代码,运行结果为
max of 2147483647, -2147483648 is -2147483648


ps>;  A0110A 的第2个代码很好的, 第1个代码也给大家指出了一个方向。谢谢A0110A。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2004-10-12 19:50 |显示全部楼层

不用判断语句,求两个数的最大值

这个不会溢出.
  1. int max(int x,int y)
  2. {
  3.     int buf[2]={x,y};
  4.     unsigned int z;

  5.     z=(((1-((x^y)>;>;31)&1)*(x-y))>;>;31)&1;
  6.     z+=(((x^y)>;>;31)&1)*((x>;>;31)&1);

  7.     return buf[z];
  8. }
  9. main()
  10. {
  11.     int x, y;
  12.     printf("ENTER:");
  13.     scanf("%d,%d", &x, &y);
  14.     printf("x=%d, y=%d\n", x, y);
  15.     printf("MAX=%d\n", max(x, y));
  16. }
复制代码

论坛徽章:
0
发表于 2004-10-13 02:13 |显示全部楼层

不用判断语句,求两个数的最大值

int max(int a, int b)
{
        int pair[2] = {a, b};
        return pair[a < b];
}

论坛徽章:
0
发表于 2004-10-13 08:49 |显示全部楼层

不用判断语句,求两个数的最大值

原帖由 "daniel-hou" 发表:
接改为
z=0^z;


是用来判断计算有没有溢出,如果溢出了就改变一下索引值。

论坛徽章:
0
发表于 2004-10-13 08:53 |显示全部楼层

不用判断语句,求两个数的最大值

原帖由 "win_hate" 发表:

max of 2147483647, -2147483648 is -2147483648
ps>;  A0110A 的第2个代码很好的, 第1个代码也给大家指出了一个方向。谢谢A0110A。


呵呵,谢啥,我来测试一下。

论坛徽章:
0
发表于 2004-10-13 09:31 |显示全部楼层

不用判断语句,求两个数的最大值

呵呵,不错,一直没注意这个,上面有位兄弟提到了,可惜我没仔细看大家的回帖,应该所有的都存在这个问题,看来程序化中还要在家一句话。

论坛徽章:
0
发表于 2004-10-13 12:43 |显示全部楼层

不用判断语句,求两个数的最大值

   好久没有来了。我也凑个热闹。

按照A0110A 的思路,将两个数相减,在-1为补码的机器上,如果最高位为1表示负数,否则为0或者正数。那么这个数并上0x80000000后再位移31位得到either 0 or 1,作为数组下标取得最大值。


int Max( int x, int y)
{
  int num[2] = {x, y};

  //if x >;= y, then idx = 0, else idx = 1
  int idx = ((x - y) & 0x80000000) >;>; 31;

  return num[idx];
}

论坛徽章:
0
发表于 2004-10-13 13:01 |显示全部楼层

不用判断语句,求两个数的最大值

楼上的别添乱了,前边已经说过多次溢出的问题了,你没看?

论坛徽章:
0
发表于 2004-10-13 13:21 |显示全部楼层

不用判断语句,求两个数的最大值

用unsigned __int64  来判断 两个int的数就没问题了 :)

论坛徽章:
0
发表于 2004-10-13 13:50 |显示全部楼层

不用判断语句,求两个数的最大值

pf! 太强了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP