Java Operator "<<" und ">>" und ">>>"?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

bitverschiebung.

Brauchst du meist nicht, außer du willst was ganz bestimmtes machen. Weißte dann wenn du es brauchst.

Du kannst z.B. die bits nach rechts verschieben um durch zwei zu teilen. 00001110 (14) geteilt durch 2 ist 00000111 (7).

um durch 4 zu teilen kannst du zweimal nach rechts shiften, um durch 8 zu teilen 3 mal, um durch 16 zu teilen 4 mal...

Solche tricks gibt es öfter. Gerade wenn man sich dadurch eine divison sparen kann, die sind sehr rechenintensiv, lohnt sich das manchmal.

Auch ein bekannter Anwendungszweck ist Fast inverse square root. Auszug aus quake 3 arena, der Programmierer hat das erfunden(mit mehreren zur selben zeit).

float Q_rsqrt( float number )
{
	long i;
	float x2, y;
	const float threehalfs = 1.5F;

	x2 = number * 0.5F;
	y  = number;
	i  = * ( long * ) &y;                       // evil floating point bit level hacking
	i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 
	y  = * ( float * ) &i;
	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//	y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

	return y;
}

Das spart extrem viel Leistung, denn Quadratwurzel ist sonst sehr aufwendig. Du siehst dieser code hat gar keine division, ist also sehr effizient. Und quadratwurzeln werden natürlich oft gebraucht, um vektoren zu normalisieren.

Er verschiebt die Bits.

Eine Zahl wird ja durch 8 Bits repräsentiert.

Du kannst dann nach links oder rechts verschieben aus 11111110 wird dann 11111111 oder eben in die andere Richtung

Das sind Bit Shift-Operatoren

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

The signed left shift operator "<<" shifts a bit pattern to the left, and the signed right shift operator ">>" shifts a bit pattern to the right. The bit pattern is given by the left-hand operand, and the number of positions to shift by the right-hand operand. The unsigned right shift operator ">>>" shifts a zero into the leftmost position, while the leftmost position after ">>" depends on sign extension.