Templatized branchless int max/min function

后端 未结 5 614
故里飘歌
故里飘歌 2021-02-05 17:34

I\'m trying to write a branchless function to return the MAX or MIN of two integers without resorting to if (or ?:). Using the usual technique I can do this easily enough for a

5条回答
  •  滥情空心
    2021-02-05 18:16

    EDIT: This answer is from before C++11. Since then, C++11 and later has offered make_signed and much more as part of the standard library


    Generally, looks good, but for 100% portability, replace that 8 with CHAR_BIT (or numeric_limits::max()) since it isn't guaranteed that characters are 8-bit.

    Any good compiler will be smart enough to merge all of the math constants at compile time.

    You can force it to be signed by using a type traits library. which would usually look something like (assuming your numeric_traits library is called numeric_traits):

    typename numeric_traits::signed_type x;
    

    An example of a manually rolled numeric_traits header could look like this: http://rafb.net/p/Re7kq478.html (there is plenty of room for additions, but you get the idea).

    or better yet, use boost:

    typename boost::make_signed::type x;
    

    EDIT: IIRC, signed right shifts don't have to be arithmetic. It is common, and certainly the case with every compiler I've used. But I believe that the standard leaves it up the compiler whether right shifts are arithmetic or not on signed types. In my copy of the draft standard, the following is written:

    The value of E1 >> E2 is E1 rightshifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 divided by the quantity 2 raised to the power E2. If E1 has a signed type and a negative value, the resulting value is implementation defined.

    But as I said, it will work on every compiler I've seen :-p.

提交回复
热议问题