How can I safely average two unsigned ints in C++?
Your last approach seems promising. You can improve on that by manually considering the lowest bits of a and b: unsigned int average = (a / 2) + (b / 2) + (a & b & 1); This gives the correct results in case both a and b are odd.