# shift operators question

ed suttner
Greenhorn
Posts: 13
I do not understand this example found in one of the books I am using to prepare for the programmer exam:
int i = 12;
int result = i >> 2; //result is 3

byte b = -42
int result = b >> 4; //result is -3
I do not understand why the first one is 3 and the second one is -3? (I do understand why it is a negative number, I just do not understand why it is -3) The first one 12/2*2 = 3. Why is -42/2*2*2*2 = -42/16 = -3? Thanks.

Phil Chuang
Ranch Hand
Posts: 251
You need to think of negative numbers in "two's complement" - that is, in order to get a negative number, you invert the bits and add 1 to it.
A short 8-bit example:
94 = 0101 1110
-94 = 1010 0001 + 1 = 1010 0010
so looking at -42,
42 = 0010 1010
-42 = 1101 0101 + 1 = 1101 0110
42 >> 4 = 0000 0010 = 2
-42 >> 4 = 1111 1101
(the far left bit always propagates right on a shift right)
invert 1111 1101 = 0000 0010 = 2
so -42 >> 4 = -3

ed suttner
Greenhorn
Posts: 13
Thanks Phil. I guess what got me confused was in the book it said that a x >> 4 is exactly the same as x / 2^4 amd that x << 4 is exactly the same as x * 2^4. So when I saw this:
byte b = -42
int result = b >> 4; //result is -3

I thought it was the same as -42 / 2^4 = -42 / 2*2*2*2 = -42/16 = -2.625.
I guess that I will not use the short cut described in the book. Thanks.

Phil Chuang
Ranch Hand
Posts: 251
Logically, the >>/<< operator does divide/multiply by powers of 2... just not for negative numbers