left shift operator, <<, in Java
By: Emiley J
The left shift operator, <<, shifts all of the bits in a value to the left a specified number of times. It has this general form:value << num
Here, num specifies the number of positions to left-shift the value in value. That is, the << moves all of the bits in the specified value to the left by the number of bit positions specified by num. For each shift left, the high-order bit is shifted out (and lost), and a zero is brought in on the right. This means that when a left shift is applied to an int operand, bits are lost once they are shifted past bit position 31. If the operand is a long, then bits are lost after bit position 63.
Java's automatic type promotions produce unexpected results when you are shifting byte and short values. As you know, byte and short values are promoted to int when an expression is evaluated. Furthermore, the result of such an expression is also an int.
This means that the outcome of a left
shift on a byte or short value will be an int, and the bits shifted left will not be lost until
they shift past bit position 31. Furthermore, a negative
byte or short
value will be sign-extended when it is promoted to int. Thus, the
high-order bits will be filled with 1's. For these
reasons, to perform a left shift on a byte or short
implies that you must discard the
high-order bytes of the int result. For example, if you left-shift a byte value, that value
will first be promoted to int and then shifted. This means that you must discard the top three bytes
of the result if what you want is the result of a shifted byte value. The easiest way
to do this is to simply cast the result back into a byte.
The following program demonstrates this
concept:
// Left shifting a byte value.
class ByteShift {
public static void main(String args[]) {
byte a = 64, b;
int i;
i = a << 2;
b = (byte) (a << 2);
System.out.println("Original value of a: " + a);
System.out.println("i and b: " + i + " " + b);
}
}
The output generated by this program is shown here:
Original value of a: 64
i and b: 256 0
Since a is promoted to int for the purposes of evaluation, left-shifting the value 64 (0100 0000) twice results in i containing the value 256 (1 0000 0000). However, the value in b contains 0 because after the shift, the low-order byte is now zero. Its only 1 bit has been shifted out.
Since each left shift has the effect of doubling the original value, programmers frequently use this fact as an efficient alternative to multiplying by 2. But you need to watch out. If you shift a 1 bit into the high-order position (bit 31 or 63), the value will become negative.
The following program illustrates this point:
// Left shifting as a quick way to multiply by 2.
class MultByTwo {
public static void main(String args[]) {
int i;
int num = 0xFFFFFFE;
for(i=0; i<4; i++) {
num = num << 1;
System.out.println(num);
}
}
}
The program generates the following output:
536870908
1073741816
2147483632
-32
The starting value was carefully chosen so that after being shifted left 4 bit positions, it would produce -32. As you can see, when a 1 bit is shifted into bit 31, the number is interpreted as negative.
Archived Comments
1. Awesome Explanation! :D
View Tutorial By: Tanishk at 2017-09-02 19:32:53
2. I did not understand the topic. Can u tell me what is the output for
System.out.println(5<
View Tutorial By: Salman at 2017-04-09 04:00:09
3. public static void main(String[] arg) {
int a=12;
int i;
i
View Tutorial By: vikas at 2017-02-23 07:27:51
4. can you explain the line below
left-shifting the value 64 (0100 0000) twice results in i cont
View Tutorial By: siraj at 2016-12-05 15:10:51
5. i could not understood the left & right shift operator so please deeply clarify this
View Tutorial By: deepak singhal at 2013-07-10 03:37:44
6. I can not understand left shift operater ,i am a fesher ,so could you clarify this doubt
View Tutorial By: umar at 2012-01-31 12:28:11
Comment on this tutorial
- Data Science
- Android
- AJAX
- ASP.net
- C
- C++
- C#
- Cocoa
- Cloud Computing
- HTML5
- Java
- Javascript
- JSF
- JSP
- J2ME
- Java Beans
- EJB
- JDBC
- Linux
- Mac OS X
- iPhone
- MySQL
- Office 365
- Perl
- PHP
- Python
- Ruby
- VB.net
- Hibernate
- Struts
- SAP
- Trends
- Tech Reviews
- WebServices
- XML
- Certification
- Interview
categories
Related Tutorials
Java program to get location meta data from an image
Program using concept of byte long short and int in java
Update contents of a file within a jar file
Tomcat and httpd configured in port 8080 and 80
Count number of vowels, consonants and digits in a String in Java
Student marks calculation program in Java
Calculate gross salary in Java
Calculate average sale of the week in Java
Vector in Java - Sample Program