Java: Right Bit Shift

Que diferencia hay entre los dos operadores de rotación de bits “>>” (signed) y “>>>” (unsigned)?

Una imagen vale más que mil palabras:

v	10000001001001001000010000010010
v>>1	11000000100100100100001000001001
v>>>1	01000000100100100100001000001001
v>>2	11100000010010010010000100000100
v>>>2	00100000010010010010000100000100
v>>3	11110000001001001001000010000010
v>>>3	00010000001001001001000010000010
-----
v	01000001001001001000010000010010
v>>1	00100000100100100100001000001001
v>>>1	00100000100100100100001000001001
v>>2	00010000010010010010000100000100
v>>>2	00010000010010010010000100000100
v>>3	00001000001001001001000010000010
v>>>3	00001000001001001001000010000010
-----
v	17
v>>1	8
v>>>1	8
v	-17
v>>1	-9
v>>>1	2147483639

Como puede verse, “>>>” rellenará por la izquierda (bit más alto) con “0”, mientras que “>>” rellenará por la izquierda con “0” si el bit más alto es “0” y con “1” si el bit más alto es “1”.

Y el código de prueba:

public class TestBits {
	public static void main(String[] args) {
		int v;
		v = 0x81248412;
		System.out.println("v\t" + pad(Integer.toBinaryString(v)));
		System.out.println("v>>1\t" + pad(Integer.toBinaryString(v>>1)));
		System.out.println("v>>>1\t" + pad(Integer.toBinaryString(v>>>1)));
		System.out.println("v>>2\t" + pad(Integer.toBinaryString(v>>2)));
		System.out.println("v>>>2\t" + pad(Integer.toBinaryString(v>>>2)));
		System.out.println("v>>3\t" + pad(Integer.toBinaryString(v>>3)));
		System.out.println("v>>>3\t" + pad(Integer.toBinaryString(v>>>3)));
		System.out.println("-----");
		v = 0x41248412;
		System.out.println("v\t" + pad(Integer.toBinaryString(v)));
		System.out.println("v>>1\t" + pad(Integer.toBinaryString(v>>1)));
		System.out.println("v>>>1\t" + pad(Integer.toBinaryString(v>>>1)));
		System.out.println("v>>2\t" + pad(Integer.toBinaryString(v>>2)));
		System.out.println("v>>>2\t" + pad(Integer.toBinaryString(v>>>2)));
		System.out.println("v>>3\t" + pad(Integer.toBinaryString(v>>3)));
		System.out.println("v>>>3\t" + pad(Integer.toBinaryString(v>>>3)));
		System.out.println("-----");
		v = 17;
		System.out.println("v\t" + v);
		System.out.println("v>>1\t" + (v>>1));
		System.out.println("v>>>1\t" + (v>>>1));
		v = -17;
		System.out.println("v\t" + v);
		System.out.println("v>>1\t" + (v>>1));
		System.out.println("v>>>1\t" + (v>>>1));
	}
	private static String pad(String v) {
		return "000000000000000000000000000000000".substring(0, 32-v.length()) + v;
	}
}

Referencia:
Bitwise and Bit Shift Operators)

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: