I\'ve been reading the classic Hacker\'s delight and I am having trouble understanding the difference between logical shift right,arithmetic shift right, and rotate right. P
The difference is pretty much explained in the right-most column.
>>
operator in C.Arithmetic shift treats the number as a signed integer (in 2s complement), and "retains" the topmost bit, shifting in zeros if the topmost bit was 0, and ones if it was one. C's right-shift operator has implementation-defined behavior if the number being shifted is negative.
For example, the binary number 11100101
(-27 in decimal, assuming 2s complement), when right-shifted 3 bits using logical shift, becomes 00011100
(decimal 28). This is clearly confusing. Using an arithmetic shift, the sign bit would be kept, and the result would become 11111100
(decimal -4, which is about right for -27 / 8).
Rotation does neither, since topmost bits are replaced by lowermost bits. C does not have an operator to do rotation.