Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: ChristianF am 16. June 2011, 09:34

Titel: Bit geschiebe mit Java
Beitrag von: ChristianF 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:
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
Titel: Re:Bit geschiebe mit Java
Beitrag von: LittleFox 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
Titel: Re:Bit geschiebe mit Java
Beitrag von: LittleFox 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
Titel: Re:Bit geschiebe mit Java
Beitrag von: MNemo 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
Titel: Re:Bit geschiebe mit Java
Beitrag von: Svenska 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
Titel: Re:Bit geschiebe mit Java
Beitrag von: MNemo 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.
Titel: Re:Bit geschiebe mit Java
Beitrag von: Svenska 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.
Titel: Re:Bit geschiebe mit Java
Beitrag von: erik.vikinger 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 (http://de.wikipedia.org/wiki/Shannon-Fano-Kodierung#Huffman-Code) kann man an einem ruhigen Wochenende implementieren.


Grüße
Erik
Titel: Re:Bit geschiebe mit Java
Beitrag von: MNemo 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.
Titel: Re:Bit geschiebe mit Java
Beitrag von: erik.vikinger 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
Titel: Re:Bit geschiebe mit Java
Beitrag von: MNemo 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.
Titel: Re:Bit geschiebe mit Java
Beitrag von: kevin 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?
Titel: Re:Bit geschiebe mit Java
Beitrag von: MNemo am 17. June 2011, 22:50
Ob er sie wirklich korrigiert weiß ich nicht; Nur das es keine Studenten sein werden.
Titel: Re:Bit geschiebe mit Java
Beitrag von: Svenska 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.
Titel: Re:Bit geschiebe mit Java
Beitrag von: rizor 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 ;)
Titel: Re:Bit geschiebe mit Java
Beitrag von: ChristianF 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. ^^