Shiften.euqals("bahnhof") == true;

Status
Nicht offen für weitere Antworten.

chrimp

Mitglied
Hallo

Jaja, die Klausurzeit rückt näher und mir fallen tagtäglich neue Sachen ein, die ich nicht wirklich gecheckt habe.
Ich habe mir jetzt schon des öfteren aus verschiedenen Quellen das Shiften durchgelesen, bin aber immer noch nicht so ganz klar damit.

Meine grundsätzliche Frage ist:
Warum überhaupt shiften?
Man kann das ganze doch auch einfach mit einer Maske (z.b. durch eine UND-Verknüpfung) lösen, oder?
Gibt es in Java keine einfachere Möglichkeit, Farbwerte zu ändern?
Ich habe hier als Beispiel ein Bild in ein Array (x) geladen und shifte nun halt wild hin und her....
Code:
static int[][] aenderFarbwert (int[][] x) {
        /* farbe=gibt an, welche Farbe verstärkt werden soll	 *
         * Blau = 0; Grün = 8, Rot = 16					         */       
        int farbe = 8;     
        
        for (int i=0; i<x.length; i++) {
            for (int j=0; j<x[0].length; j++) {
                    int farbaenderung = 0xFF;
                    x[i][j] = x[i][j] & (farbaenderung << farbe);
                } //end for 
            } //end for 
        
        return x;
    } //end Methode aenderFarbwert

Bin mir aber nicht sicher, ob ich das überhaupt richtig verstanden habe.

Dann noch eine Frage:
Was genau ist der Unterschied zwischen >>> und >>?
Der >>> ist Rechtsschieben mit Nullexpansion, der ander ohne.
Aber was steht dann in den Bits, wenn keine Nullen eingefügt werden? Einfach der alte Bitwert?

Danke schonmal für eure Hilfe!
 

0xdeadbeef

Top Contributor
Man muß vielleicht erklären, daß (fast) jeder Mikroprozessor einen Shift-Befehl hat. Es gibt eine ganze Reihe von Algorithmen, die man mit Shifts sehr elegant lösen kann, nicht zuletzt kann man aber halt auch sehr schnell/elegant durch Zweierpotenzen teilen bzw. mit Zweierpotenzen multiplizieren.
Die 8bit-Prozessoren (wie der MOS 6502 im C64) hatten überhaupt keinen Befehl für die Multiplikation. Da mußte man sich dann mit Shifts und Additionen begnügen.
Heutzutage tritt das etwas in den Hintergrund: auf vielen Risc-Prozessoren ist ein Shift um X Bits nicht unbedingt schneller als eine Multiplikation.

Zum ">>" vs. ">>>":
Das Schieben von Vorzeichenbehafteten Zahlen ist ein gewisses Problem: wenn man nach rechts schiebt (also durch 2^x) teilt, müssen auf der linken Seite ja 1er oder 0er eingefügt werden. In C gibt es nur den Operator ">>", das genaue Verhalten ist compilerabhängig. In Java hat man diesen Schwachpunkt erkannt und zwei getrennte Operatoren eingefügt:
">>" schiebt Einsen ein, wenn die zu schiebende Zahl kleiner als 0 ist (dann ist das höchstwertige Bit gesetzt). Ansonsten werden links Nullen eingefügt.
">>>" schiebt immer Nullen ein - unabhängig vom Vorzeichen der Zahl bzw. dem höchstwertigen Bit. Das ist z.B. dann sinnvoll, wenn ein int eigentlich eine vorzeichenlose (unsigned) Zahl enthält, für die es in Java aber keinen Datentyp gibt.
 

chrimp

Mitglied
Dann erstmal vielen Dank für eure Antworten.

Werde mir das jetzt nochmal genau anschauen und evtl. entstandene Fragen hier posten!

Danke für die Hilfe!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben