Why not just x/2 + y/2 ?
For signed integers, you need to be careful depending on the language you are using. Most languages provide a signed right shift that doesn’t lose the sign.
Personally, I think shift should always have been a bitwise operator, without sign extension. To me signed right shift feels as sensible as right shifting a floating point number - a shift is bitwise and not an arithmetical operator. But I guess that’s what comes from being brought up on healthy machine code by robots in the steel jungle.
C recommendation: “INT13-C. Use bitwise operators only on unsigned operands” https://wiki.sei.cmu.edu/confluence/plugins/servlet/mobile?c...
But y>>1 + x>>1 + (x & y & 1) is easier to remember than ((x^y)>>1) + (x&y).