programming forums Java Java JSRs Mobile Certification Databases Caching Books Engineering OS Languages Paradigms IDEs Build Tools Frameworks Products This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
Sheriffs:
Saloon Keepers:
Bartenders:

# 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

 It is sorta covered in the JavaRanch Style Guide.