Search code examples
javabit-manipulationbitwise-operatorsbit-shiftnegative-number

Java: right shift on negative number


I am very confused on right shift operation on negative number, here is the code.

int n = -15;
System.out.println(Integer.toBinaryString(n));
int mask = n >> 31;
System.out.println(Integer.toBinaryString(mask));

And the result is:

11111111111111111111111111110001
11111111111111111111111111111111

Why right shifting a negative number by 31 not 1 (the sign bit)?


Solution

  • Because in Java there are no unsigned datatypes, there are two types of right shifts: arithmetic shift >> and logical shift >>>. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

    Arithmetic shift >> will keep the sign bit.
    Arithmetic shift

    Unsigned shift >>> will not keep the sign bit (thus filling 0s).
    Logical shift

    (images from Wikipedia)


    By the way, both arithmetic left shift and logical left shift have the same result, so there is only one left shift <<.