Search code examples
c++cbinary-operators

Char substraction with clipped underflow


is there a way to compute:

/** clipped(a - b) **/
unsigned char clipped_substract(unsigned char a, unsigned char b)
{
    return a > b ? a - b : 0;
}

using some binary operations instead of a test?


Solution

  • /** clipped(a - b) **/
    unsigned char clipped_substract(unsigned char a, unsigned char b)
    {
        return a - (a+b) / 2 + getAbs(a-b) / 2;
    }
    
    unsigned int getAbs(int n)
    {
        int const mask = n >> (sizeof(int) * 8 - 1);
    
        return ((n + mask) ^ mask);
    }