File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes >>> operator Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Spring in Action this week in the Spring forum!
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark ">>> operator" Watch ">>> operator" New topic
Author

>>> operator

Sean Walker
Ranch Hand

Joined: Feb 04, 2004
Posts: 64
I encoutered the following question:
Which of the following results in a negative value of a?
A: int a = -1; a = a >>> 8;
B: byte a = -1; a = (byte)(a >>> 5);
C: int a = -1; a = a >> 5;
D: int a = -1; a = a >>> 32

The answer is supposed to be A, B and D.
I don't see this at all. I would think the only negative one would B.
I believe that A, C and D are incorrect because any time an int is unsigend-right-shifted, a positive number results.
In the case of B above though things are sort of different. As I recall when a non-int is acted on by any shift operation, it is first cast to an int and then the shifting is performed. This converts the byte of -1 (11111111) into the int form of -1 (11111111111111111111111111111111). This is unsigned-right-shifted by 5, which results in some positive number (00000111111111111111111111111111). Which is then cast back into the form of a byte which leaves us with -1 again (11111111 that is).
Am I right here?


Sean Walker<br />PMP, SCEA, SCWCD, SCJP
Adam Altmann
Greenhorn

Joined: Nov 15, 2003
Posts: 21
I wrote the following program:
public class Test{
public static void main(String[] args){
int A = -1;
A = A >>> 8;

byte B = -1;
B = (byte)(B >>> 5);

int C = -1;
C = C >> 5;

int D = -1;
D = D >>> 32;

System.out.println("A = " + A);
System.out.println("B = " + B);
System.out.println("C = " + C);
System.out.println("D = " + D);
}
}
And got these results:
A = 16777215
B = -1
C = -1
D = -1

Honestly, this makes no sense to me. I would think that C is the only right answer, since >>> is the unsigned right shift (it fills the bits to the left with 0) and >> fills the left with whatever the sign bit is. In Two's Complement, negative numbers have a 1 as their Most Significant Bit. Since each of these start as negative (with MSB of 1), only choice C should stay negative, since it will be the only one left with a MSB of 1 (because A, C, D fill with 0).
Can someone please explain this? I'm thoroughly confused.


SCJP 1.4
Bert Bates
author
Sheriff

Joined: Oct 14, 2002
Posts: 8829
    
    5
Just taking a quick look without getting out my pencil and paper...
B *could* be correct since you're doing a cast after the shift and just grabbing the rightmost 8 bits - the 8th bit might be a 1
C is using the signed shift operator - so the sign bit will be replicated
D - The right hand shift operator can only be, in practice, from 0-31 for ints and from 0-63 for longs. Think about it like using the remainder operator - in this case the right operand (32) becomes 0, so no shifting occurs!
good luck in your studies!


Spot false dilemmas now, ask me how!
(If you're not on the edge, you're taking up too much room.)
Davy Kelly
Ranch Hand

Joined: Jan 12, 2004
Posts: 384
The signed bit is the left most bit so >>> changes a 1 to 0 but not from 0 to 1, the >> keeps the sign bit so if it was 1 all bit shifted will be 1's and 0 with 0's, hopefully the bold has worked below

Which of the following results in a negative value of a?
A: int a = -1; a = a >>> 8;
B: byte a = -1; a = (byte)(a >>> 5);
C: int a = -1; a = a >> 5;
D: int a = -1; a = a >>> 32

A is:
11111111 11111111 11111111 11111111 >>> 8 gives you
00000000 11111111 11111111 11111111 this results in a big poistive int number.
B is:
converts the byte to an int then does the shifting, then casts back to a byte so bits look like this:
byte 11111111 promoted to 11111111 11111111 11111111 11111111 then shift to get 00000111 11111111 11111111 11111111 but we convert back to get the last 8 bits on the right hand side which is 11111111 byte -1
C is:
11111111 11111111 11111111 11111111 then shift with which ever the left most bit was which is 1 to get the same result
D is:
11111111 11111111 11111111 11111111 by 32 bits, I needed the pencil first time round, but then i noticed that it can only shift 31 times to give you +1 but 32 times is shifting 0 times so hence the same result of -1.
I normally find it easier writing out the bits first then trace out what will happen to the bits.
I hope this helps guys
Davy
[ February 18, 2004: Message edited by: Davy Kelly ]

How simple does it have to be???
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: >>> operator