For doing a right shift of unsigned values, the following functions work for me:
unsigned rshift_round_down(unsigned x, unsigned a) {
return x >> a;
}
unsigned rshift_round_up(unsigned x, unsigned a) {
return (x >> a) + ((x & ((1 << a) - 1)) != 0);
}
unsigned rshift_round_halfway(unsigned x, unsigned a) {
return (x >> a) + ((x >> (a - 1)) & 1);
}
unsigned rshift_round_towards_even(unsigned x, unsigned a) {
return (x >> a) + ((x >> (a - ((x & ((1 << a) - 1)) != 1 << (a - 1)))) & 1);
}
Is there a simpler but equivalent implementation of rshift_round_towards_even?