现在的位置: 首页 > 综合 > 正文

求两个int之间较小的数

2017年12月21日 ⁄ 综合 ⁄ 共 1028字 ⁄ 字号 评论关闭

主要来源于这个帖子: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];

抱歉!评论已关闭.