signedを論理シフトしたいなら、単にキャストすればいいだけでないの?
int n = -1;
n = (unsigned)n >> 1;

なんかはずしてる?