# Left Shift Operator

Java allows bit shifting feature on integral type data. Shift operators are not used much in everyday programming task. But for interviews, questions of shift operators might be there. Before understanding what left shift does we first have to understand that how does integral data stored in Java. Note once again that only integer values can be left shifted in Java. Left shift operator is declared as ‘<<‘  (two less than characters) in java.

For integer number 10, it is stored in 4-bytes.

`00000000 00000000 00000000 00001010`

Now when you use left shift operator i.e 10 << 1 it will shift one bit to left. Now, number is stored like this,

```00000000 00000000 00000000 00001010 : 10
00000000 00000000 00000000 00010100 : 10 << 1 = 20
```

So, now value 10 becomes 20 (for binary 10100). If we want to shift by 2 bits like 10 << 2, then number will be 40 (for binary 101000),

```00000000 00000000 00000000 00001010 : 10
00000000 00000000 00000000 00101000 : 10 << 2 = 40
```

Similarly if we shift number 10 by 3 bits it will become 80. So here we can conclude that left shift works according to following formula,

number * 2 ^ shiftBitCount

Note here that left shift operator is signed operator and so it preserves the sign of the number during shift. For negative number say -10 the binary representation in 4 bytes will be 2’s complement of 10,

For number 10 we will do 1’s complement and add 1 to it,

``` 11111111 11111111 11111111 11110101 : 1's complement of 10
+00000000 00000000 00000000 00000001 : +1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11111111 11111111 11111111 11110110 : -10```

Let’s perform shift operation on -10 << 1,

`1111111 11111111 11111111 111101100 : -10 << 1 = -20`

Notice that while shifting we are padding zeros to the right and the shifted bits are lost in the space forever. Here the same formula applies and other than that the sign of the number is preserved by the left shifting operation.

Following Java program can elaborate the stated logic, kindly visit to my Number To Binary Hexa Octa String for basic introduction about Integer#toBinaryString.

```public class LeftShiftOperator {
public static void main(String[] args) {
int ten = 10;
System.out.println("Binary of " + ten + " : " + Integer.toBinaryString(ten));
ten = ten << 1;
System.out.println("Binary after left shift : " + Integer.toBinaryString(ten));
System.out.println("Shift Result of positive : " + ten);

int minusTen = -10;
System.out.println("Binary of minus " + minusTen + " : "+ Integer.toBinaryString(minusTen));
minusTen = minusTen << 1;
System.out.println("Binary after left shift : "+ Integer.toBinaryString(minusTen));
System.out.println("Shift Result of negative : " + minusTen);
}
}```

Above program will give us following output,

```Binary of 10 : 1010
Binary after left shift : 10100
Shift Result of positive : 20
Binary of minus -10 : 11111111111111111111111111110110
Binary after left shift : 11111111111111111111111111101100
Shift Result of negative : -20```

Left shift can only be performed on integer value we can do the shift on byte, short and char as well after casting them to int value. Because all the stated types are internally represented as an integer data.

Apparently, for shifting the auto-unboxing also takes place for wrapper class of int, Integer.

```Integer ten = new Integer(10);
ten = ten << 1;//It's valid due to auto-unboxing```

One more thing to note is that the left shifted bits are gone and never return back or can not be used any further for our integer value. So for large number if we shift them left the value may give you small negative value.

For example Integer.MAX_VALUE,

```01111111111111111111111111111111 : Integer.MAX_VALUE
1111111111111111111111111111110 : Integer.MAX_VALUE << 1 = -2```

# Comparator in Java8

Comparator is comparatively easy to use in Java8. Functional style of programming in Java8 has introduced new way to use the comparator.

This is what we we do before Java8. Kindly note that getDob() method returns date of birth of a Student, which is java.util.Date instance.

```studentList.sort(new Comparator<Student>() {

@Override
public int compare(Student o1, Student o2) {
return o1.getDob().compareTo(o2.getDob());
}
});```

Here we can see that we have to create the anonymous class of comparator and then we provide the sorting logic.  With Java8 we can use Lambada expression to reduce the extra boiler plate code of comparator declaration and compare method declaration.

```studentList.sort((o1, o2) ->  {
return o1.getDob().compareTo(o2.getDob());
});```

You can see how it is reduced in size. Even more there are lot of default methods has been introduced in Comparator interface. For example,

`studentList.sort(Comparator.comparing(Student::getDob));`

Here comparing method will prepare the comparator based on the method reference we have provided. Moreover, we can also simply reverse the order of sorting,

`studentList.sort(Comparator.comparing(Student::getDob).reversed());`

Lot more default methods are there in Comparator interface to reduce the extra code of comparator declaration and speed up the development.

# Replace portion of String

To replace specific portion of String, say we have String like `Hello 1234!` and we want to convert it to `Hello 12World34!` then we don’t have any direct way to go with `String`. Continue reading “Replace portion of String”

# Primitive Arrays as a List

Noticed many times that conversion of `int[]` to `List<Integer>` is headache. When you write `Arrays.asList(new int[]{1,2,3});` it will return Continue reading “Primitive Arrays as a List”

# Format Date

In real life application we have to format the Date as in user interface we have to display Date in some other format while our database stores it in a different format. To keep sync between those two formats we have to change the date format. Continue reading “Format Date”

# Immutable Class

Immutable class, class whose state can not be changed.

Here state of class refers to the state of Object of class. Once we create Object of immutable class we can not change the state, other way, field of the Object. Continue reading “Immutable Class”

# Hello Jar

.jar, the wrapped or archived Java application to be used or run on any system with required java run time (JRE). It should have main method, the entry point to start the execution of the application. You can create the jar file with the help of inbuilt Java Archive Tool which is provided in JDK. Continue reading “Hello Jar”

# Number to Binary, Hexa, Octa String

Some times we need the binary, hexadecimal or octal representation of the integer. In java you can easily have this with Integer class in one line. Continue reading “Number to Binary, Hexa, Octa String”

# BubbleSort with Java

Bubble sort is one of the easiest algorithms. It simply uses iteration and swapping in it. In this algorithm smaller elements of the array or list  bubbles up to first that’s why it’s named as bubble sort.

Say we have array of {5, 4, 0, 3, 7}, than bubble sort takes first element Continue reading “BubbleSort with Java”