Search code examples
c#c++sortingintegerbranchless

Sorting 3 numbers without branching


In C# or C++ how can I implement a branch-free sort of three (integer) numbers?

Is this possible?


Solution

  • No conditionals. Only a cast to uint. Perfect solution.

    int abs (int a) 
    {
        int b = a;
        b = (b >> (sizeof(int)*CHAR_BIT-1) & 1);
        return 2 * b * (a) + a; 
    }
    int max (int a, int b) { return (a + b + abs(a - b)) / 2; }
    int min (int a, int b) { return (a + b - abs(a - b)) / 2; }
    
    
    void sort (int & a, int & b, int & c)
    {       
       int maxnum = max(max(a,b), c);
       int minnum = min(min(a,b), c);
       int middlenum = a + b + c - maxnum - minnum;
       a = maxnum;
       b = middlenum;
       c = minnum;
    }