Autor Thema: Bit geschiebe mit Java  (Gelesen 6030 mal)

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« am: 16. June 2011, 09:34 »
Moin moin,

ich sitze hier vor einem Problem und komme einfach nicht zur Lösung. Und zwar habe ich folgendes Problem:

Ich habe 4 Werte (Helligkeit, Rot, Grün und Blau), z.B. so: 0, 234, 12, 67. Binär sieht das ganze ja so aus (es werden von 32 Bit immer nur die ersten 8 genutzt):
0000 0000 -> 0
1110 1010 -> 234
0000 1100 -> 12
0100 0011 -> 67

Nun muss ich das ganze Bit für Bit durchgehen (angefangen beim höchsten) und das immer nach unten hin gruppieren, damit dann die folgende Bitfolge daraus wird:
0100 0101 0100 0000 0110 0010 0101 0001
Mein bisheriger Ansatz sah wie folgt aus:
  • Ich laufe von 7 ab runter bis einschließlich 0
  • Zusammenschieben der Bitfolge anhand des aktuellen Durchlaufs
for(int i = 7; i >= 0; i--)
{
int brightness, red, green, blue;
int pos = 0;

// get values
brightness = 0;
red = 234;
green = 12;
blue = 67;

// Bit abhängig von der aktuellen Position holen
// - Bit um i Stellen nach vorne schieben (>> i)
// - Bit ganz nach vorne schieben (>> (7 - i))
// - Überflüssige Daten wegschmeißen (&0x01)
// - Bit an die korrekte Position schieben.
pos |= ((((brightness >> i) >> (7 - i)) & 0x01) << 3);
pos |= ((((red >> i) >> (7 - i)) & 0x01) << 2);
pos |= ((((green >> i)>> (7 - i)) & 0x01) << 1);
pos |= ((((blue >> i) >> (7 - i)) & 0x01) << 0);

// Weitere basteleien mit der Position
}

Wenn meine Beispielwerte nicht gänzlich falsch sind, sollte ja beim 2. Durchlauf (i = 6) pos den Wert 5 haben, allerdings ist dem nicht so.
 
Ich bin das ganze auch schon mit dem Debugger durchgegangen, und deswegen weiß ich, dass das letzte Bit (blau) irgendwie verloren geht.
 
Könnt ihr mir da vielleicht weiter helfen?

Grüße Christian

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #1 am: 16. June 2011, 10:08 »
Moin,

direkt zu deinem Problem hab ich momentan leider noch keine Idee, sorry.
Mir sind allerdings 2 Sachen aufgefallen:
 - wozu bei RGB noch die Helligkeit?
 - wären die Werte (BRGB) auserhalb der for-Schleife nicht besser aufgehoben?

An deinem Problem überleg ich natürlich auch, wenn mir da noch etwas einfällt, melde ich mich nochmal

Grüße,
LittleFox

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #2 am: 16. June 2011, 10:42 »
Moin,

">> (7 - i)" der teil macht mich etwas stutzig - der Wert der geschoben wird hat das gewünschte Bit schon an der ersten Stelle.
Der Blau-Wert wird noch ein Bit weitergeschoben (7 - i(6)) und damit ist an erster Stelle eine 0

Grüße,
LittleFox

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 16. June 2011, 13:22 »
Lol, ChristianF(eo52xofo) in deinem Profil steht was von Azubi ^^


Also die Variablen initialisierung macht in der schleife wenig sinn, dann wird ja alles wieder überschrieben.
und dann hast du mit  >> i >> (7-i) immer um 7 nach rechtsgeschiftet, wie litlefox schon gesagt hat.

außerdem willst du ja nicht immer nur die unteren 4 bit von pos, beschreiben sondern die gesamten 32 oder?

dann kommt da bei mir das hier raus.
int brightness, red, green, blue;
int pos = 0;

// get values
brightness = 0;
red = 234;
green = 12;
blue = 67;

for(int i = 7; i >= 0; i--)
{

pos <<= 4;  // <<<<<<<<<<<<<<<<<<<<< für die nächsten vier bit platz machen.

// Bit abhängig von der aktuellen Position holen
// - Bit um i Stellen nach vorne schieben (>> i)
// - Überflüssige Daten wegschmeißen (&0x01)
// - Bit an die korrekte Position schieben.
pos |= (((brightness >> i) & 0x01) << 3);
pos |= (((red >> i) & 0x01) << 2);
pos |= (((green >> i) & 0x01) << 1);
pos |= (((blue >> i)  & 0x01) << 0);

// Weitere basteleien mit der Position
}
System.out.println(Integer.toBinaryString(pos));

Edit:
Ah, ich sehe gerade erst "//Weitere basteleien mit der Position" dann ist das "pos <<= 4" warscheinlich doch überflüssig, wenn du das gleich verarbeitest; und pos = 0, macht aufeinmal in der schleife doch wieder sinn.
 
--
MNemo
« Letzte Änderung: 16. June 2011, 13:45 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 16. June 2011, 13:48 »
Hallo,

was soll die Ergebnisbitfolge eigentlich darstellen? Der Sinn ist für mich nicht wirklich nachvollziehbar.

Die Helligkeit lässt sich übrigens aus den RGB-Farbwerten ausrechnen: entweder euklidisch vom Nullpunkt sqrt(R²+G²+B²) oder durch Transformation in den HSV-Farbraum: V=0.213*R+0.715*G+0.072*B. Je nach Helligkeitsdefinition gibt es auch andere Faktoren.

Zur Implementation wurde ja schon alles gesagt.

Gruß,
Svenska

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. June 2011, 13:53 »
Mit brightness wird in der Aufgabenstellung der Alpha-Kanal bezeichnet.
Ziel ist es ein Bild zu Komprimieren (verlust-behaftet). Durch die Umkodierung ist das relativ einfach möglich, einfach ein paar untere Bits weglassen, und es ändert sich nur etwas an der farbintensität.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 16. June 2011, 23:15 »
Achso. Klingt mir bisschen nach einer typischen Übungsaufgabe von der Uni: Gut zu begründen, theoretisch nachvollziehbar und absolut sinnfrei.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 17. June 2011, 09:42 »
Hallo,


.... und absolut sinnfrei.
Also wenn das "typisch" für Aufgaben von Unis ist dann bin ich echt froh das ich nie in einer war.  ;)  SCNR


@MNemo/ChristianF:
Warum überrascht Ihr Euren Prof nicht mit einer kurzen Implementierung eines simplen Kompressionsalgorithmus? Lauflängenkodierung ist wirklich simpel und selbst Huffman kann man an einem ruhigen Wochenende implementieren.


Grüße
Erik
« Letzte Änderung: 17. June 2011, 10:04 von erik.vikinger »
Reality is that which, when you stop believing in it, doesn't go away.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 17. June 2011, 20:46 »
Jo, ist ne uni aufgabe.

Der Prof guckt sich das warscheinlich nicht mal an, und auch die  Tutoren werden für das abweichen von der Aufgabenstellung auch keine Punkte verteilen.

Aber Hoffman solln wir auch implementieren.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 17. June 2011, 21:00 »
Hallo,


Der Prof guckt sich das warscheinlich nicht mal an ....
:-o Bekommt ihr dort auch Zensuren und wenn ja von wem?

Aber Hoffman solln wir auch implementieren.
Na, wenigstens etwas. Keine Angst, Huffman ist recht simpel. Wenn man schon etwas Übung mit Bäumen usw. hat dann ist das wirklich an einem Wochenende komplett programmiert (Kompression und Dekompression), natürlich noch nicht auf maximale Performance getrimmt aber sauber funktionierend.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 17. June 2011, 21:52 »
Der Prof guckt sich das warscheinlich nicht mal an ....
:-o Bekommt ihr dort auch Zensuren und wenn ja von wem?
Von Tutoren(Studenten) bekomment wir Punkte auf die Projecte. Und das gibt naher dann bonuspunkte auf die Klausur, die wohl vom Prof korrigiert wird.

Aber Hoffman solln wir auch implementieren.
Na, wenigstens etwas. Keine Angst, Huffman ist recht simpel. Wenn man schon etwas Übung mit Bäumen usw. hat dann ist das wirklich an einem Wochenende komplett programmiert (Kompression und Dekompression), natürlich noch nicht auf maximale Performance getrimmt aber sauber funktionierend.
Angst ^^, Ne, das sind alles Projekte die man (mit etwas erfahrung) jeweils alleine an einem Wochenende hinkriegt. Und wir haben 2Wochen Zeit und bis zu 3er-Teams.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 17. June 2011, 22:28 »
Von Tutoren(Studenten) bekomment wir Punkte auf die Projecte. Und das gibt naher dann bonuspunkte auf die Klausur, die wohl vom Prof korrigiert wird.
Huch, ist dem etwa immer so langweilig, dass er sowas selber macht?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 17. June 2011, 22:50 »
Ob er sie wirklich korrigiert weiß ich nicht; Nur das es keine Studenten sein werden.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 17. June 2011, 23:16 »
Sei dir da nicht so sicher - ich habe auch schon Klausuren kontrolliert. Da war ich 5. Semester. :-D
Wahrscheinlich sind aber Hiwis und manche Profs machen das wirklich selbst.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 18. June 2011, 00:32 »
Offiziell dürfen Tutoren keine Klausuren korrigieren, habe ich aber auch schon gemacht.
Frag halt nur im Fachbereich nach. Wenn sie ihre Prüfungsordnungen kennen, werden sie dir sagen, dass das alles die WMs und die Professoren machen ;)
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #15 am: 22. June 2011, 09:16 »
@MNemo:
Lol, woher weißt du das nur... Habe mein Profil hier noch nicht aktualisiert. Die Ausbildung habe ich ja hinter mir.  :wink:
 
Sinn der Aufgabe war im Groben einmal eine Kompression mit Huffman und dann mit einem Trie zu machen. Geht (meine Meinung) wohl nur darum Stoff aus der Vorlesung durch Praxis zu festigen...
 
ja... man hat 2 Wochen Zeit... Dumm nur, wenn eine Woche wegen einer Klausur praktisch wegfällt.
 
Zu einer Lösung bin ich auch irgendwann gekommen. Kleiner Hinweis, warum ich das gemacht habe: Ich habe im Trie alle Kinder in einem Array abgelegt (16 Elemente). Dadurch kann man dann anhand der "berechneten" Position einfach bestimmen, wo es weiter geht. Wie ich auf das (7 - i) gekommen bin weiß ich jetzt aber nicht mehr. ^^

 

Einloggen