amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > "<<<"-Operator in JAVA [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

09.10.2007, 16:23 Uhr

Honitos
Posts: 200
Nutzer
Hallo Experten,

ich bin gerade dabei, einen JAVA-Ausdruck nach AmiBlitz3 zu konvertieren und bin nicht sicher, wie ich obigen Operator "übersetzten" soll.

Original:
ir[0] &= 0xff >>> ir.length * 8 -ks;

meine Version:
ir(0) = ir(0) & ($FF LSR (ir_length * 8 - ks))

LSR bedeutet hier "logisches Shifting nach rechts".

Hat das ">>>" was mit vorzeichenbehaftetem Shift zu tun ??

Gruss,
Sven

[ - Antworten - Zitieren - Direktlink - ]

09.10.2007, 17:22 Uhr

Holger
Posts: 8116
Nutzer
Logisches Shift bedeutet ohne Vorzeichen, das heißt, links werden Nullen eingefügt und entspricht exakt dem ">>>" Operator, Arithmetisches Shift bedeutet mit Vorzeichen, anders gesagt, das höchstwertige Bit wird repliziert, und entspricht dem ">>" Operator.

Du hast es also richtig umgesetzt.

Nur das Thema hat den falschen Titel :)

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

09.10.2007, 17:39 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Eine kleine Optimierung und annäherung an den original Source:

Original:
ir[0] &= 0xff >>> ir.length * 8 -ks;

AB3:
ir(0) & ($FF LSR (ir_length * 8 - ks))


--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

09.10.2007, 17:45 Uhr

Honitos
Posts: 200
Nutzer
Danke,


dann frage ich mich, warum in dem Source mal << und mal <<< verwendet wird, wenn es sich grundsätzlich um vorzeichenlose Bytefolgen handelt.

anderes Beispiel:
ir[0] |= 0x01 << ((ks+7) %8);

habe ich konvertiert zu (danke für den Tipp Wanderer):
ir(0) | ($01 LSL ((ks + 7) MOD 8) )


Warum hier << statt <<< ??
Ich dachte, das hier die 1 einfach um den Klammerausdruck nach links geshiftet wird!?

[ Dieser Beitrag wurde von Honitos am 09.10.2007 um 17:47 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

09.10.2007, 17:54 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Beim Hochshiften ist ASL und LSL gleich, nur
einige Status Flags werden möglicherweise anders gesetzt.
Das Resultat ist aber das gleiche.
Vielleicht einfach schlamping programmiert ?


--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

09.10.2007, 17:55 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Honitos:
dann frage ich mich, warum in dem Source mal << und mal <<< verwendet wird, wenn es sich grundsätzlich um vorzeichenlose Bytefolgen handelt.

Ich glaube nicht, dass "<<<" verwendet wird ;)
Zitat:
Warum hier << statt <<< ??
Weil es keinen "<<<" Operator gibt. Für Shifts nach links macht es keinen Unterschied, ob der Shift logisch oder arithmetisch ist, in beiden Fällen würden Nullen eingefügt werden. Deshalb gibt es erst gar keine zwei Operatoren für Linksshifts in Java.

Übrigens macht es auch für die Konstante 0xFF keinen Unterschied, ob es logisch oder arithmetisch geshiftet wird, es ist ja positiv (solange es keiner Variablen vom Typ byte zugewiesen wird). Für Daten, die aus einem byte-Array gelesen werden, dagegen schon.

Ansonsten würde ich auch statt x % 8 , zumindest da, wo es eh um Bitmanipulation geht, lieber (x) & 7 schreiben, das ist um Welten effizienter.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

09.10.2007, 17:57 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Vielleicht einfach schlamping programmiert ?


In diesem Punkt definitiv nicht. ;)

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

10.10.2007, 14:55 Uhr

Honitos
Posts: 200
Nutzer
Zitat:
Original von Holger:
keiner Variablen vom Typ byte zugewiesen wird). Für Daten, die aus einem byte-Array gelesen werden, dagegen schon.


Aha, vielleicht liegt da noch ein Problem, denn:

//'ir' is a bit string of ks bits, this means that if you want to place
//the bit string 'ir' in a byte array, the byte array have to at least a
//length of ((ks + 7) / 8 ) bytes.
final byte[] ir = new byte [(ks + 7) / 8];

Die Felder in dem JAVA-Source sind von Typ byte.
Aber ich dachte mir implizit, "das wird schon unsigned sein, denn es geht hier ja um vorzeichenlose Binärdaten!".

Hat der Operator hier also andere Auswirkungen ?

[ Dieser Beitrag wurde von Honitos am 10.10.2007 um 14:56 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.10.2007, 18:24 Uhr

Holger
Posts: 8116
Nutzer
@Honitos:

Zitat:
Original von Honitos:
Hat der Operator hier also andere Auswirkungen ?

Also erst mal vorweg: wenn Du wie bisher einfach >>> mit LSR und >> mit ASR übersetzt, kannst Du kaum was falsch machen. Der Ausgangscode scheint ja in diesem Punkt vollkommen korrekt zu sein.

Was die Auswirkungen des Operators angeht: wenn die Daten unsigned wären, wäre der >>> Operator überflüssig.

Zitat:
Aha, vielleicht liegt da noch ein Problem, denn:
...
Die Felder in dem JAVA-Source sind von Typ byte.
Aber ich dachte mir implizit, "das wird schon unsigned sein, denn es geht hier ja um vorzeichenlose Binärdaten!".


Nun, in Java sind sämtlich Integer-Datentypen, ausgenommen char, signed. Außerdem wird grundsätzlich mit dem int Datentyp gerechnet, wenn die Quelldaten byte, short, char oder int sind, selbst wenn die Zielvariable vom selben, kleineren Datentypen ist. Wenn Du entsprechenden Code in eine andere Sprache konvertierst, kann das Probleme machen. Wenn der Code allerdings, wie in Deinem Fall, inhaltlich sowieso eher mit signed Daten hantiert, ist das Ergebnis meist richtig, allerdings nicht immer effizient.

Der entsprechende Java-Code enthält dann halt oftmals Ausdrücke, die in der anderen Programmiersprache überflüssig sind. Wie z.B. b & 0xFF, um ein vorzeichenbehaftetes byte in vorzeichenloses int zu konvertieren, oder einen type-cast auf byte nach einer Berechnung mit byte-Operanden. Oder eine sorgfältige Unterscheidung zwischen ">>>" und ">>", wo es in anderen Sprachen durch den Datentyp bedingt keinen Unterschied macht.

Aber Schaden anrichten können diese Anweisungen keinen...

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

12.10.2007, 10:00 Uhr

Honitos
Posts: 200
Nutzer
@Holger:
Danke für die Info, Holger !

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > "<<<"-Operator in JAVA [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.