主要来源于这个帖子: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)]; }
还有这个办法:
int a = 3 , b = 4 ; int m[ 2 ]; int bigger; m[ 0 ] = a; m[ 1 ] = b; bigger = m[(a - b) >> 31 ];