Code kürzen

Fabian04088

Aktives Mitglied
Java:
public static int prevLength(int len) {
   if ((len & 1) == 1) {
      int zweierpotenz = 1;
      while (true) {
         if (len <= zweierpotenz)
            return zweierpotenz >> 1;
         else
            zweierpotenz = zweierpotenz << 1;
      }
   } else {
      return len >> 1;
   }
}

kann man das auch kürzer schreiben oder um ändern, weil ich will wissen was für Möglichkeiten man sonst noch hat
 
Zuletzt bearbeitet von einem Moderator:
Ich weiß zwar nicht genau, was Du da berechnen willst, aber vermute mal log2(len):
Java:
int n = 0;
while ((len >>> n) > 0) {
    n++;
}
return n;
 
Ich weiß auch nicht, was das soll. Wenn man die Werte mal für len=0..128 tabuliert, kommen ganz wilde Ergebnisse heraus... am meisten wundert es mich, dass alle geraden Zahlen einfach halbiert werden. So ist die Reihe dann für 0..20 zum Beispiel die folgende: 0 0 1 2 2 4 3 4 4 8 5 8 6 8 7 8 8 16 9 16 10... WTF?
Für den Fall von ungeraden Zahlen würde der folgende Code das machen, was der aktuelle Code auch tut:
Java:
public static int prevLengthOddLen(int len) {
  return Integer.highestOneBit(len);
}
(mit dem einzigen komischen Sonderfall mit len=1, für den der Originalcode 0 zurückgibt)
 
nein war in unserer Vorlesung und keiner hat es verstanden deswegen habe ich jetzt gefragt ob es jemand kürzen kann damt ich es besser verstehe 🙂
 
Das ist was ganz anderes. Erstmal die Übersetzung:
Code:
Falls len ungerade, dann {
  zp = 1;
  wiederhole {
    Falls len <= zp
        gib zp/2 zurück
    sonst
        verdopple zp
  }
} sonst {
  gib len/2 zurück
}

Der Fall "len ist gerade", ist also ziemlich unspektakulär. Im ungeraden Fall wird die kleinste Zweierpotenz >= len gesucht. Von dieser Zweierpotenz wird dann die Hälfte zurückgegeben. Sieht man mal von len=1 ab, ist die Hälfte einer Zweierpotenz die "vorhergehende", d. h. es wird für ungerade len>1 die größte Zweierpotenz < len geliefert, was dem Wert des höchstwertigen, gesetzten Bits in len entspricht. Für len=1 liefert die Methode dagegen 0.
 
Java:
 if (len <= zweierpotenz)
     return zweierpotenz >> 1;
else
     zweierpotenz = zweierpotenz << 1;

Schau dir mal den Teneryoperator an.

Das Weglassen von geschweiften Klammern würde ich persönlich nicht als Verkürzung ansehen, sondern als Obfuskation. Aber solange das trotzdem kompiliert werden kann ist das nur meine bescheidene Meinung.
 

Zurück
Oben