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