Spezielles Shifting

  • Themenstarter Ishildur (PassLost)
  • Beginndatum
Status
Nicht offen für weitere Antworten.
I

Ishildur (PassLost)

Gast
Hallo zusammen, ich habe zwei Fragen betreffend dem Bitshifting:

1. Was bedeutet >>> ? Das sehe ich zum ersten Mal. In der Erklährung steht, dass man damit shiften kann, ohne das Vorzeichen zu beachten, aber wie wirkt sich dies denn aus?

2. Gibt es eine Möglichkeit, Bits so zu shiften, dass, falls links oder rechts ein Bit (Aus dem Rahmen) fällt, dies an der anderen Seite wieder eingefügt wird? So eine Art Bitrotating?

Lg Ishildur
 
S

SlaterB

Gast
man, man, man

1.
ist es denn so schwer, das mal auszuprobieren?

Code:
		int k = 6645;
		for (int i = 0; i < 10; i++) {
			k = k >> 1;
			System.out.println(k + " - " + Integer.toBinaryString(k));
		}
mit großen und kleinen Zahlen, mit positiven und negativen testen,
und dann das gleiche mit >>>

2.
mag diesmal ein Glückstreffer sein, aber oft ist google wirklich sofort da..

http://www.google.de/search?hl=de&q=java+bit+operationen+rotating&btnG=Google-Suche&meta=

http://javainsel.blogspot.com/2006/05/insselraus-die-bit-rotieren.html
 
I

Ishildur (LostPwd)

Gast
@SlaterB Ich habe schon gesehen, dass das nicht genau dasselbe gibt, nur verstehe ich nicht ganz, wie das Ganze funktioniert...

Ich habe noch eine kleine Frage an dich: Wie kann ich alle Bits eines Bytes in der umgekehrten Reihenfolge anordnen?

Bspw.: 00101110 => 01110100 Geht das überhaupt?

Damit könnte ich eine polynomiale Matrixmultiplikation extrem beschleunigen...
 

Wildcard

Top Contributor
Bei Java hast du mit solchen Bitoperationen schlechte Karten.
Du kannst bits nicht in eine andere Variable schieben.
 
S

SlaterB

Gast
> Ich habe schon gesehen, dass das nicht genau dasselbe gibt, nur
> verstehe ich nicht ganz, wie das Ganze funktioniert...

falls das halb ne Frage war weigere ich mich immer noch diese zu beantworten,

testen und lernen, wenn man das daraus nicht erkennt dann gut nacht ;)
schon schlimm genug, selber nicht auf die Idee zum Testen zu kommen

-----------
00101110 => 01110100
geht natürlich auch irgendwie, nach einer vorgegeben Operation würde ich gar nicht erst suchen,
falls nicht Performanz ganz oben steht,

simpelste Idee: in einen String, diesen spiegeln, und zurückrechnen,
dafür gibts nämlich schon Operationen (oder sonst selber machen)

tja und viel schneller gehts eigentlich kaum, ein int[] statt eines Strings vielleicht,

oder es auch mal auf Bitebene versuchen, das ist dann wirklich schneller:
ne for-Schleife über alle 8 bits,
das i.te Bit mit einer Maske bestimmen, auf Position 7-i verschieben und in eine neue Variable einfügen,

das geht ja schon im gewissen Sinne
byte k = 0;
k = k | (byte) 0x4;
-> 3. Bit von rechts auf 1 gesetzt
 

Ark

Top Contributor
Seit der 1.5 gibt's eine statische Methode java.lang.Integer.reverse(int), die das erledigt. ;)

Bitteschön. ^^

MfG
Ark
 

Leroy42

Top Contributor
SlaterB hat gesagt.:
1. ist es denn so schwer, das mal auszuprobieren?

Was ist das denn für eine Vorgehensweise? Trial and Error...? :autsch:

Für soetwas ist die Java Language Specification da.

JLS hat gesagt.:
The value of n>>>s is n right-shifted s bit positions with zero-extension. If n is positive, then the result is the same as that of n>>s; if n is negative, the result is equal to that of the expression (n>>s)+(2<<~s) if the type of the left-hand operand is int, and to the result of the expression (n>>s)+(2L<<~s) if the type of the left-hand operand is long. The added term (2<<~s) or (2L<<~s) cancels out the propagated sign bit. (Note that, because of the implicit masking of the right-hand operand of a shift operator, ~s as a shift distance is equivalent to 31-s when shifting an int value and to 63-s when shifting a long value.)

Zu finden in JLS: 15.19 Shift operators
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben