免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HappyWin
打印 上一主题 下一主题

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

论坛徽章:
0
131 [报告]
发表于 2005-06-06 14:30 |只看该作者

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

PF

论坛徽章:
0
132 [报告]
发表于 2005-06-06 15:16 |只看该作者

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

m = m & ~( m / 2 ) & ~( m / 4)
为什么这句可以得到最高的那一位呢


阿我理解了,那并不是最高一位,而是把后头两位给弄成0
可是这样一定能确保(x & m) / m = 1吗?
假设
m=000100110
x=000100001
那么(x&m)/m = 0

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
133 [报告]
发表于 2005-06-06 15:30 |只看该作者

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

原帖由 "bleem1998" 发表:
m = m & ~( m / 2 ) & ~( m / 4)
为什么这句可以得到最高的那一位呢

不是最高的一位,而是把m变成:0...0100X...X这样的形式,即1后面有两个0
于是当x在该位上为1时:
(x & m) + m / 2 >;=0...0100...0 + 0...0010...0 = 0...0110...0 >;=m
(x & m) + m / 2) <= 0...01001...1 + 0...001001...1 <= 0...011...10 < 2m
所以((x & m) + m / 2) / m = 1
而当x在该位上为0时:
(x & m) + m / 2 <= 0...00001...1 + 0....001001...1 = 0...0011...1 < m
所以((x & m) + m / 2) / m = 0

论坛徽章:
0
134 [报告]
发表于 2005-06-06 15:44 |只看该作者

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

被你打败了
这都想得出来
厉害

论坛徽章:
0
135 [报告]
发表于 2005-06-06 19:17 |只看该作者

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

原帖由 "yuxh" 发表:

不是最高的一位,而是把m变成:0...0100X...X这样的形式,即1后面有两个0
于是当x在该位上为1时:
(x & m) + m / 2 >;=0...0100...0 + 0...0010...0 = 0...0110...0 >;=m
(x & m) + m / 2) <= 0...01001............


也没必要这样,如果能有一个函数返回 m 的第一个为 1 的位置,那么问题不就很简单了?假设 m 的第 i 位是 1,那么( ( x & ( 1 << i ) ) >;>; i ) & x 就代表 x 是否在该位上为 1。
int bit( int v, int i )
{
        return ( v & (1 << i) ) >;>; i ;
}
int first_one( int x )
{
        int i,j,ret;

        i = 0;
        ret = 0;
        for( j=31; j>;=0; j-- ){
                ret |= bit(x,j) & (!ret);
                i += (!ret);
        }
        i = 31 - i;
        return i;
}

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
136 [报告]
发表于 2005-06-06 19:19 |只看该作者

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

我在前面的解释中说过了不能用循环
for( j=31; j>;=0; j-- )
这里j>;=0不就是判断吗?

论坛徽章:
0
137 [报告]
发表于 2005-06-06 19:28 |只看该作者

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

晕了,我上一面的算法里也用了判断,悲哀!

我在前面的解释中说过了不能用循环
for( j=31; j>;=0; j-- )
这里j>;=0不就是判断吗?


这个把循环展开,体力活啊

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
138 [报告]
发表于 2005-06-06 19:38 |只看该作者

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

原帖由 "zleil" 发表:


这个把循环展开,体力活啊

想着想着就迷糊了,我也犯过这个错误的呀!幸亏发现得早,不然浪费不少时间了
呵呵~~~

论坛徽章:
0
139 [报告]
发表于 2005-06-06 19:42 |只看该作者

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

原帖由 "yuxh" 发表:

想着想着就迷糊了,我也犯过这个错误的呀!幸亏发现得早,不然浪费不少时间了
呵呵~~~


说实话,你那个 m = a ^ b 真是太强了!!!

论坛徽章:
0
140 [报告]
发表于 2005-06-07 11:16 |只看该作者

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

int  main(int argc,char *argv[])
{
if(argc!=3)
  {
        printf("Usage:%s num1 num2\n",argv[0]);
        exit(0);
}
int num[3];
   int index=0;
   num[0]=atoi(argv[1]);
   num[1]=atoi(argv[2]);
   num[2]=atoi(argv[2]);

   index=num[2]-num[0];
   index=index/abs(index)+1;
   printf("The max is [%d]\n",num[index]);
        return 1;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP