求两个int之间较小的数

主要来源于这个帖子:http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html

相关的还有这个帖子:http://topic.csdn.net/t/20030731/19/2094930.html#top





要求是不用比较,不用if,不用第三方函数,不用内嵌汇编,不用递归,求两个int之间较小的那个。


42楼的方法:

#include <stdio.h>

// 要求实现的函数
int Min(int a, int b)
{
    int sum = a + b;                            // 先算除两者的和
    b = a - b;
    a += b * (b >> (sizeof(int) * 8 - 1));        // 得到的a是两者中的较大值

    return sum - a;                                // 用和减去较大者,即得到较小者
}

// 测试代码
int main(void)
{
    int a = 128;
    int b = 126;
    printf("The smaller one of %d and %d is %d\n", a, b, Min(a, b));

    return 0;
}
虽然这个方法在溢出上貌似还有点问题,但是这个想法我是想不到了,记录下来。。。




还有66楼的式子:

(b*(a/b) + a*(b/a))/(a/b + b/a);
我居然是看了很久才看懂这个式子,真是惭愧。

但是这个式子在a、b是相反数(3和-3),a、b某一个为0的时候,还是不能满足要求。但是利用了int 的除法特性,记录下来。。。






还有105楼,据说是所有解法当中最好的一个(但是仍然没有符合要求):

//研究出来了,
#define sign(x) ((x)>>31&1)
int Min(int a, int b)
{
int ba[2] = {b, a};
return ba[sign(a)+1-sign(b)+sign(a-b)>>1];
}
//还有一种解法:
int Min(int a, int b)
{
int babbaaba[2][2][2] = {b, a, b, b, a, a, b, a};
return babbaaba[sign(a)][sign(b)][sign(a-b)];
}



还有这个办法:

C/C++ code
   
   
int a = 3 , b = 4 ; int m[ 2 ]; int bigger; m[ 0 ] = a; m[ 1 ] = b; bigger = m[(a - b) >> 31 ];

如果a>b,则a-b的二进制表示中最高位为0,(a-b)>>31 = 0;bigger = m[0];
如果a<b,则a-b的二进制表示中最高位为1,(a-b)>>31 = 1;bigger = m[1];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值