How do I programmatically return the max of two integers without using any comparison operators and without using if, else, etc?

后端 未结 10 2181
一生所求
一生所求 2020-12-09 10:35

How do I programmatically return the maximum of two integers without using any comparison operators and without using if, else, etc?

10条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-09 11:01

    From z0mbie's (famous virii writer) article "Polymorphic Games", maybe you'll find it useful:

    #define H0(x)       (((signed)(x)) >> (sizeof((signed)(x))*8-1))
    #define H1(a,b)     H0((a)-(b))
    
    #define MIN1(a,b)   ((a)+(H1(b,a) & ((b)-(a))))
    #define MIN2(a,b)   ((a)-(H1(b,a) & ((a)-(b))))
    #define MIN3(a,b)   ((b)-(H1(a,b) & ((b)-(a))))
    #define MIN4(a,b)   ((b)+(H1(a,b) & ((a)-(b))))
    //#define MIN5(a,b)   ((a)<(b)?(a):(b))
    //#define MIN6(a,b)   ((a)>(b)?(b):(a))
    //#define MIN7(a,b)   ((b)>(a)?(a):(b))
    //#define MIN8(a,b)   ((b)<(a)?(b):(a))
    
    #define MAX1(a,b)   ((a)+(H1(a,b) & ((b)-(a))))
    #define MAX2(a,b)   ((a)-(H1(a,b) & ((a)-(b))))
    #define MAX3(a,b)   ((b)-(H1(b,a) & ((b)-(a))))
    #define MAX4(a,b)   ((b)+(H1(b,a) & ((a)-(b))))
    //#define MAX5(a,b)   ((a)<(b)?(b):(a))
    //#define MAX6(a,b)   ((a)>(b)?(a):(b))
    //#define MAX7(a,b)   ((b)>(a)?(b):(a))
    //#define MAX8(a,b)   ((b)<(a)?(a):(b))
    
    #define ABS1(a)     (((a)^H0(a))-H0(a))
    //#define ABS2(a)     ((a)>0?(a):-(a))
    //#define ABS3(a)     ((a)>=0?(a):-(a))
    //#define ABS4(a)     ((a)<0?-(a):(a))
    //#define ABS5(a)     ((a)<=0?-(a):(a))
    

    cheers

提交回复
热议问题