Shiften

  • Themenstarter Themenstarter mester
  • Beginndatum Beginndatum
M

mester

Hi,

und zwar wird im folgenden Beispiel die int Variable 8 mal geshiftet und hat am Ende den Wert 15

00011110 = 30
00111100 = 60
01111000 =120
11110000 =240
11100001 =225
11000011 =195
10000111 =135
00001111 = 15

Wie kann ich den das in Java realisieren? Ich brauche ein Funktion, der ich ein Wert übergebe und die Anzahl wie oft der Wert geshiftet wird. Das Problem was ich habe ist, wie ich das rasugeshiftete MSB wieder an das LSB anhänge.

gruss
mester
 
Hallo,

Bitweise Operationen werden durch die einfachen & und | realisiert (doppelt sind es immer die boolschen Verknüpfungen).

Folgende Methode vollführt genau einen solche shift. In einer entsprechenden Schleife kannst du dann deine 8 Verschiebungen realisieren. (oder wenn es immer 8 sind auch nach dem gleichen Prinzip eine neue Methode schreiben)

Java:
/**
 * Verschiebt das übergebene Bitmuster um eine Position nach links. Das
 * nun über die angegebene Länge hinausragende Bit wird wieder
 * nach vorn geschrieben.
 * 
 * @param value
 *        zu verschiebendes Bitmuster
 * @param length
 *        Länge des zu verschiebenden Bitmusters
 * @return erzeugtes Bitmuster
 */
public static int shift(final int value, final int length) {
    // alles um ein Bit nach rechts verschieben
    int shiftedValue = value << 1;
    // eine Maske fuer das ueberhaengende Bit erzeugen
    int mask = (int) Math.pow(2, length);
    // ueberhaengendes Bit auf das erste Bit setzen
    if ((shiftedValue & mask) > 0) {
        // das ueberhaengende Bit ist 1
       shiftedValue++;
    }
    // Maske auf den gueltigen Bereich anpassen
    mask--;
    // ueberhaengendes Bit abschneiden
    shiftedValue &= mask;
    return shiftedValue;
}


Viele Grüße
Carron
 
Zuletzt bearbeitet:
Hi.

@Carro: Warum so kompliziert? Man kann doch die Rotation um n Stellen auch ohne Schleife machen.

Java:
// mode: groovy !

// rotate len rightmost bits of val n times:
def rotate_left(val, len, n) {
  mask = (~0 << len)
  bits = ~mask & val
  return (mask & val) | (~mask & (bits << n)) | (bits >> (len - n))
}
@mester: Du rotierst übrigens nur 7 mal, wenn du 8 mal rotierst, hast du wieder den Originalwert.

Gruß
 
Ja ich weiss ich rotiere sieben mal. Danke an euch beiden. Klappt wunderbar...

mfg
mester
 
Zurück