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.

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.