... and don't forget, ASR is not the same as divide by 2!
It's close.
You can follow the C standard correctly by adding 1 before shifting, if and only if the number is negative. In other words, unconditionally add the sign (leftmost bit).
On a machine like RISC-V with fast large shifts but no condition codes you can do it like:
srli tmp,x,63
add x,x,tmp
srai x,x,1
On a machine with slow or only single bit shift, but with condition codes you can do it like:
lsl tmp,x,1
adc x,x,0
asr x,x,1
If you've only got a single accumulator, e.g. 6502, then you need to juggle a little:
tax
asl a
txa
adc #0
asr a
gcc on x86_64 chooses the first method even though it has a carry flag.
Any of these is going to be massively faster than doing a real divide, even if it's not just a single instruction.