It's not a secret anymore!*
The moose likes Beginning Java and the fly likes shift operators question Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of OCM Java EE 6 Enterprise Architect Exam Guide this week in the OCMJEA forum!
JavaRanch » Java Forums » Java » Beginning Java
Bookmark "shift operators question" Watch "shift operators question" New topic
Author

shift operators question

ed suttner
Greenhorn

Joined: Mar 04, 2003
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

Joined: Feb 15, 2003
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
add 1, you get 3
so -42 >> 4 = -3
ed suttner
Greenhorn

Joined: Mar 04, 2003
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

Joined: Feb 15, 2003
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.
 
subject: shift operators question