aspose file tools*
The moose likes Programmer Certification (SCJP/OCPJP) and the fly likes Shift Operator Gurus !! Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Certification » Programmer Certification (SCJP/OCPJP)
Bookmark "Shift Operator Gurus !!" Watch "Shift Operator Gurus !!" New topic
Author

Shift Operator Gurus !!

mo odunaiya
Greenhorn

Joined: Jul 23, 2001
Posts: 19
I have included some shift operator questions from JQ Plus which
I have troubles with. I know this should be a "breeze through" for the Gurus on this issue, but these questions have given me some headaches. Can anybody please make some comments on how the answers were derived
Question ID :952739435490
What would be printed during execution of the following program?
public class TestClass
{
public static void main(String args[ ] )
{
shiftTest(1, "A" ) ;
shiftTest(1<<31, "B") ;<br /> shiftTest(1<<30, "C") ;<br /> shiftTest(-1, "D" ) ;<br /> }<br /> public static void shiftTest(int i , String str) <br /> {<br /> if (( i >> 1) != (i >>> 1)) System.out.println(str) ;
}
}
***************************************************************
b, d Can you please explain the concept
***************************************************************
Question ID :955935425650
Consider :
class A {}
class B extends A {}
class C extends B {}
Which of these boolean expressions correctly identifies when an object 'o' acutally refers to an object of class B and not A or C?
***************************************************************
(o instanceof b) && (!(o instanceof a))
(o instanceof B) && (!(o instanceof c)) //correct
!(!(o instanceof B) | | (o instanceof c)) // correct
(o instanceof B)&&!((o instanceof A)| |(o instanceof c))
***************************************************************

Question ID :954698538220
Which statments about the output of the following programs are true?
public class TestClass
{
public static void main(String args[ ] )
{
int i = 0 ;
boolean bool1 = true;
boolean bool2 = false;
boolean bool = false;
bool = (bool2 & method1("1")); //1
bool = (bool2 && method1("2")); //2
bool = (bool1 | method1("3")); //3
bool = (bool1 | | method1("4")); //4
}
public static boolean method1(String str)
{
System.out.println(str);
return true;
}
}
*************************************************
1 and 3 will be part of the output?
Question:
*************************************************
Question ID :952739436700
What will be the outpout of the following program?
public class TestClass
{
public static void main(String args[ ] )
{
int i = 0 ;
boolean bool1 = true ;
boolean bool2 = false;
boolean bool = false;
bool = ( bool2 & method1(i++) ); //1
bool = ( bool2 && method1(i++) ); //2
bool = ( bool1 | method1(i++) ); //3
bool = ( bool1 | | method1(i++) ); //4
System.out.println(i);
}
public static boolean method1(int i)
{
return i>0 ? true : false;
}
}
*************************************************
it will print 2
*************************************************
Question ID :961883785420
What would be printed during execution of the following program?
public class TestClass
{
public static void main(String args[])
{
System.out.print(" "+(1<<33)+" "+(1<<32)+" "+ Integer.toHexString(1<<31) );
}
}
*************************************************
what will this output?
*************************************************

Desai Sandeep
Ranch Hand

Joined: Apr 02, 2001
Posts: 1157
Hi,
I think most of the questions are explained pretty well in Khalid's books.Also, I had discussed about bit shifting in a recent post posted by Payal.
If you still face any problems, please do let us know.
- Sandeep
SCJP2, OCSD(Oracle JDeveloper), OCED(Oracle Internet Platform)

<b>Sandeep</b> <br /> <br /><b>Sun Certified Programmer for Java 2 Platform</b><br /> <br /><b>Oracle Certified Solution Developer - JDeveloper</b><br /><b>-- Oracle JDeveloper Rel. 3.0 - Develop Database Applications with Java </b><br /><b>-- Object-Oriented Analysis and Design with UML</b><br /> <br /><b>Oracle Certified Enterprise Developer - Oracle Internet Platform</b><br /><b>-- Enterprise Connectivity with J2EE </b><br /><b>-- Enterprise Development on the Oracle Internet Platform </b>
Ashish Hareet
Ranch Hand

Joined: Jul 14, 2001
Posts: 375
Left Shift ( << ) --<br /> The << moves all of the bits in the specified value to the left by the number of bit positions specified . also note that for each shift left , the high order bit is shifted out (i.e. lost) & a zero is brought in on the right .<br /> Here's how 1 << 3 will be evaluated<br /> 00000000 00000000 00000000 00000001 --- 1<br /> Shift left 3 times & you get<br /> 00000000 00000000 00000000 00001000 ---- 8<br /> <br /> Right Shift --<br /> The >> shifts all of the bits in a value to the right a specified number of times .<br /> Try 8 >> 3<br /> 00000000 00000000 00000000 00001000 ----> 8<br /> Shift right 3 times<br /> 00000000 00000000 00000000 00000001 ---> 1
The tricky part when you are shifthing right ( >> ) is that the leftmost(top) bits exposed by the right shift are filled in with the previous contents of the top bit & not just zero's .
Try -8 >> 2
11111111 11111111 11111111 11111000 ----> -8
Shift right 2 times & you get
11111111 11111111 11111111 11111110 ---> -2
Another interesting thing is that no matter how much you shift -1 right the result will always remain zero .
11111111 11111111 11111111 11111111 ---> -1

Unsigned Right Shift -
>>> is like >> except that it always shifts zero's into the high order bit i.e. to say that the leftmost bits exposed by the right shift are filled in with zero's .
-8 >>> 2
11111111 11111111 11111111 11111000 ----> -8
00111111 11111111 11111111 11111110 ----> 1073741822
Extend this whole thinghy to your first code & you'll get the answer & here's something i do to get me the binary equivalents
System.out.println(Integer.toBinaryString(1<<3));
Experiment with this for a while & you'll get a hang of the concept .
Ashish
Ashish Hareet
Ranch Hand

Joined: Jul 14, 2001
Posts: 375
Your 2nd code
Let's assume that o is of type B & the heirarchy is "C extends B" & "B extends A"
And we'll figure this one out first
(o instanceof b) && (!(o instanceof a))
(o instanceof b) = true
Quote from JLS
The && operator is like & , but evaluates its right-hand operand only if the value of its left-hand operand is true. It is syntactically left-associative (it groups left-to-right) .( JLS 15.23)
o is an instance of B & B extends A so o is an instance of A aswell .
Hence
(o instanceof a) = true &
(!(o instanceof a)) = false
So
(o instanceof b) && (!(o instanceof a)) = false
If o is of type A then ----
(o instanceof b) = false & the right side is never evaluated & the net result is
(o instanceof b) && (!(o instanceof a)) = false
If o is of type C then ---
(o instanceof b) = true
So we evaluate the right hand side
(o instanceof a) = true
(!(o instanceof a)) = false
Net result
(o instanceof b) && (!(o instanceof a)) = false
What we are looking for is that the expression return a definitive true or false when o is of type B which it doesn't do . So not correct .
(o instanceof b) && (!(o instanceof a)) = false //when o of type B/A/C

----------------------------------------
Now the next line
(o instanceof B) && (!(o instanceof c))//presumably correct
Let's say that o is of type B then ----
(o instanceof B) = true
Since true the right hand side is evaluated
(o instanceof c) = false
(!(o instanceof c)) = true
(o instanceof B) && (!(o instanceof c)) = true
If o is of type C -----
(o instanceof B) = true
Since true the right hand side is evaluated
(o instanceof c) = true
(!(o instanceof c)) = false
Net result
(o instanceof B) && (!(o instanceof c)) = false
If o is of type A ----
(o instanceof b) = false
& now the right hand side of the expression is never evaluated so ,
(o instanceof B) && (!(o instanceof c)) = false
With this expression you are sure to get a true whenever o is an object of type B . And so i'd say that this is correct .
(o instanceof B) && (!(o instanceof c)) = true //when o is type B
(o instanceof B) && (!(o instanceof c)) = false //when o is of type C
(o instanceof B) && (!(o instanceof c)) = false //when o is of type A
Correct me if i'm wrong .
Well , with this cryptic explanantion i'm sure you'll decipher the rest .
If i don't get something like this , here's what i do
-See what the operands do
-Stare at the code for an hour or so
-And then i get the picture . Always works for me .
The other codes are also on the same lines . Try to work on them yourself .
Ashish Hareet
Ranch Hand

Joined: Jul 14, 2001
Posts: 375
In the last code toHexString() creates a string representation of the integer argument as an unsigned integer in base 16 . You can always convert a binary form to a hexadecimal form easily . Here's how you do it -
10000000 00000000 00000000 00000000 ---> -2147483648
To convert a binary number to it's hexadecimal equivalent , make groups of four bits starting from the least significant bit(LSB) i.e. the rightmost bit moving towards the most significant bit(MSB) i.e. the leftmost bit . So we do that
1000 0000 0000 0000 0000 0000 0000 0000
And now we replace each group of four bits by it's hexadecimal representation .
80000000
Just in case you don't have binary & decimal equivalents of hexadecimal numbers , let me know , i'll post it for you . I'm sure you can find it on the net aswell .
[This message has been edited by Ashish Hareet (edited July 28, 2001).]
Jane Griscti
Ranch Hand

Joined: Aug 30, 2000
Posts: 3141
Hi Mo,
In future would you please limit your questions to one per post? Makes them a little easier to deal with
Thanks
------------------
Jane Griscti
Sun Certified Programmer for the Java� 2 Platform


Jane Griscti
SCJP, Co-author Mike Meyers' Java 2 Certification Passport
Kris Decker
Ranch Hand

Joined: Jul 25, 2001
Posts: 38
Not sure that I completely understand this comment:

Another interesting thing is that no matter how much you shift -1 right the result will always remain zero .
11111111 11111111 11111111 11111111 ---> -1
Ashish Hareet
Ranch Hand

Joined: Jul 14, 2001
Posts: 375
Hi Kris ,
I'll try to exlain it again
-8 >> 2
11111111 11111111 11111111 11111000 ----> -8
Shift right 2 times & you get
11111111 11111111 11111111 11111110 ---> -2
As you notice the void left behind by shifthing right is filled in by the top bits(leftmost bits) & not zero's .
Keepin this in mind try
-1 >> 2
11111111 11111111 11111111 11111111 ---> -1
Now shift right 2 times keeping in mind that the void is filled by 1's(since 1 is the top bit) .
You see that no matter how much you right shift ( >> ) -1 the result will always be -1.
Note that I'm talkin bout right shift( >> ) & not the unsigned right shift( >>> ) . The unsigned right shift fills the void with zero no matter what the top bits were .
Ashish
Kris Decker
Ranch Hand

Joined: Jul 25, 2001
Posts: 38
got it! Thanks soooo much! Bit shifting has been a nuisance for me...
Kris
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Shift Operator Gurus !!
 
Similar Threads
bit shifting
Assignment Q
Language Fundermentals
operator and assignment
Boolean Output?