This week's book giveaway is in the Jobs Discussion forum.We're giving away four copies of Customer Requirements for Developers and have Marcho Behler on-line!See this thread for details.
Big Moose Saloon
 Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies Register / Login Win a copy of Customer Requirements for Developers this week in the Jobs Discussion forum!

# shift operators

dhana rangu
Ranch Hand

Joined: Oct 01, 2003
Posts: 65
can any one help me in this
What is the result that will be printed out here ?

a)0
b)-256
c)127
d)-127
e)-1
I feel that the answer for the above question is 0.but the answer is -256.
128:0000 0000 1000 0000
i= -128 :1111 1111 1000 0000
byte(i) =1000 0000
byte(i)<< 1 =0000 0000
can any one explain this
dhana
[ January 08, 2004: Message edited by: dhana rangu ]
Rama Kumar PV
Greenhorn

Joined: Dec 26, 2003
Posts: 26
Dhana,
If you shift a char, byte, or short, it will be promoted to int before the
shift takes place, and the result will be an int.
Try changing the code to
byte i =-128;
System.out.println(i<<=1);
to get the value of 0.
Vicken Karaoghlanian
Ranch Hand

Joined: Jul 21, 2003
Posts: 522
The casting to byte has absolutly no effect on the result. The result is always -256 whether we kept the (byte) or removed it.

- Do not try and bend the spoon. That's impossible. Instead, only try to realize the truth. - What truth? - That there is no spoon!!!
dhana rangu
Ranch Hand

Joined: Oct 01, 2003
Posts: 65
Thanks a lot vicken and ramkumar..
What i understood is this...
Exlicit casting donot effect the result after shifting ...But implicit casting effect the result after shifting
byte b=-128;
if we shift this we get 0.means after shifting the result is being implicitly casted to byte since b here is a byte..(If i am not wrong)
dhana.
Ray Stojonic
Ranch Hand

Joined: Aug 08, 2003
Posts: 326
After some testing I note the following:
in the line: System.out.println( (byte)i << 1 );
1) i is cast to byte (casting occurs before shifting in the order of operations)
2) i is promoted to int for shifting
3) i is shifted
4) -256 is printed
if the line is changed to:
System.out.println( (byte)( i << 1 ) );
1) i is shifted
2) result is cast to byte
3) 0 is printed
hth
Vicken Karaoghlanian
Ranch Hand

Joined: Jul 21, 2003
Posts: 522
Originally posted by Ray Stojonic:

if the line is changed to:
System.out.println( (byte)( i << 1 ) );
1) i is shifted
2) result is cast to byte
3) 0 is printed
hth

Ray, here you are casting the result of the shift operation, that is why the answer differs.
Ray Stojonic
Ranch Hand

Joined: Aug 08, 2003
Posts: 326
Ray, here you are casting the result of the shift operation, that is why the answer differs.

Yes, that may be why step 2 says "result is cast to byte"...
example 1 shows what happens in the original example, example 2 shows how it would need to be written to get the 'expected' result
dhana rangu
Ranch Hand

Joined: Oct 01, 2003
Posts: 65
thanks a lot ray and vicken finally i understood
Shilpi M Agarwal
Greenhorn

Joined: Jan 09, 2004
Posts: 3

i<<1 is same as i*2 and so it is -256.. is this explaination correct?
Corey McGlone
Ranch Hand

Joined: Dec 20, 2001
Posts: 3271
That's correct, but you need to be careful.
In general, you can think of a left or right shift as a multiplication or division by a power of 2, but you need to be careful in that thinking. What happens if a data bit "falls off" the end? Let me change your example just a little:

Hmmm...certainly, -128 * 2 is not 0, but that's what it outputs. Why?
The reason for this is that a byte of data just fell off the end during the shift. Here's what -128 looks like in binary:
10000000
If we left shift that by 1 position, we're left with this:
00000000
That's 0, not -256. You see, left and right shifting is equivalent to multiplication and division only as long as you do not have overflow of some sort. In this case, -256 doesn't fit in a byte (it's range is -128 to 127) so we have overflow. Therefore, our bit operation no longer matches conventional mathematics.
I hope that helps,
Corey

SCJP Tipline, etc.

I agree. Here's the link: http://aspose.com/file-tools

subject: shift operators