Bitoperationen und überhaubt und so. PANIK

Status
Nicht offen für weitere Antworten.
G

grayson

Gast
Hallo leute!

nachdem ich mich nun schon eine weile mit java befasse bin ich nunmehr auf ein problem gestoßen, bei dem ich genau das brauche, was ich bissher immer versucht hab zu vermeiden weil ich es in den paar stunden berufschule nicht gerafft hab.

und zwar geht es um das hier:

ich habe einen dokumentenviewer in dem man wie in echt halt gelbe zettel auf das dokument kleben kann, text markieren kann etc. also kurz annotationen erstellen kann.

dazu werden mir in der annotationsklasse diverse konstanten zur verfügung gestellt:



TRANSPARENt=0
OPAQUE=1
HIGHLIGHT=2
BORDER=4
TEXT=8


um zb. eine klebezettel annotation zu erzeugen steht in der datenbank als wert eine 13 damit der viewer weis --> ok das ist jetzt nen klebezettel.

13 ist in diesem fall also 1+4+8

das ganze teil wird in einem bitmuster verodert usw. und da steig ich ums verrecken nicht durch.

das selbe gillt für shiften bei bildoperationen---> sehr beliebt und schnell aber ich raffs einfach nicht.


kann mir jemand diese sachen mal idioten like erklären oder weis wo ich dazu eine erklärung im stil "..für superJavaDummies" bekomme ?


vielen dank


gray
 

mic_checker

Top Contributor
es wäre noch ganz gut zu wissen wobei du probleme hast.

Zu Operatoren kannst du sicher mal im Java Handbuch (www.javabuch.de) oder in Java ist auch eine Insel was nachlesen.

Was verstehst du beim Bitmuster nicht ?
 

AlArenal

Top Contributor
So ein Bitmuster ist ne praktische Sache wenn man einzelne Wahrheitsaussgen (true/false) in einen Wert zusammenfassen kann.

Jedem Wert ist eine Potenz von 2 (weil binär nunmal zwei Zustände hat) zugewiesen. Durch die Addition der Werte dieser Potenzen erhält man in einer einzigen Integer-Zahl verpackt alle Werte die true sind, sieht man ja auch in deinem Beispiel. 13 heißt 1, 4 und 8 sind gesetzt, sprich das Ding ist sichtbar, hat nen Rahmen und enthält Text.

Ich benutzte sowas zum Datentransfer. Statt lauter true/false per XML zu verpacken und zu übertragen, habe ich den Kram in einem Integer verpackt. So reduziere ich benötigte Bandbreite/Übertragungszeit.

Um den Kram gewissermaßen zu dekodieren, macht man nichts anderes als der Reihe nach mit der höchsten Potenz beginnend zu prüfen ob der Wert >= ist. Dein Beispiel ist im übrigen falsch. Es müsste lauten:

TRANSPARENT = 1
OPAQUE = 2
HIGHLIGHT = 4
BORDER = 8
TEXT = 16

Dekodierung geht in etwa so:

Code:
isText = false;
isBorder = false;

...

if (wert >= 16) { 
  isText = true;
  wert -= 16;
}

if (wert >= 8) {
  isBorder = true;
  wert -= 8;
}

...

Kann man natürlich auch direkt über Bit-Shifts machen.
 

KISS

Bekanntes Mitglied
warum nicht
Code:
public boolean flagSet(int flag,int wert)
{
  return flag==(flag & wert);
}

.
.
.

boolean transparent=flagSet(TRANSPARENT,wert);

funktioniert allerdings nicht mit 0 als flag
 

messi

Bekanntes Mitglied
Code:
Binär/Dezimal
0001 =  1
0010 =  2
0100 =  4
1000 =  8

1101 = 13
Wenn du wissen willst, ob z.B. das 3. Bit (von rechts) gesetzt ist, kannst du auch eine UND-Verknüpfung mit "4" und anschließend einen Vergleich mit "0" benutzen:
Code:
 1101
& 0100
= 0100 (!= 0)

if ((13 & 4) != 0) {
    System.out.println("Das 3. Bit (0100) ist gesetzt");
}
 
G

grayson

Gast
wow, danke für die schnellen antworten ! ich werd mir eure posts jetzt mal zu gemüte führen.

ich denke mal, die anwendung ist nicht so das große problem, vielemehr das system das dahinter steht. mir fehlt es schlicht an der vorstellungskraft/dem verständnis mir vorzustellen, was wie wo passiert wennich beispielsweise shifte.

normalerweise hat man ja so nen kleines bild im kopf, wie etwas ablaufen soll, aber bei diesen sachen .....
 
G

grayson

Gast
AlArenal hat gesagt.:
Um den Kram gewissermaßen zu dekodieren, macht man nichts anderes als der Reihe nach mit der höchsten Potenz beginnend zu prüfen ob der Wert >= ist. Dein Beispiel ist im übrigen falsch. Es müsste lauten:

TRANSPARENT = 1
OPAQUE = 2
HIGHLIGHT = 4
BORDER = 8
TEXT = 16

Dekodierung geht in etwa so:
...


stimmt schon so mit 0,1,2,4,8

0 ist ja transparent. wenn das teil also 0 ist, kann es ja auch kein border etc mehr geben ;)

ok so weit so gut. ich bild mir ein das so einigermaßen verstanden zu haben.

jetzt weiter:

parallel zu den beschreibungen der oberen Konstanten einer Annotation gibt es natürlich auch noch diese:
TYP_POSTIT (klebezettel) =0
TYP_TEXT_BOX (einfache textbox)=1
TYP_MARKER (textmarker)=2
TYP_STAMP(stempel--> genehmigt etc.)=3

es gibt also die 4 "Stil" konstanten
TRANSPARENT = 0
OPAQUE = 1
HIGHLIGHT = 2
BORDER = 4
TEXT = 8
aus denen sich das aussehen zusammensetzt und die typkonstanten

eine transparente textbox sieht zb als kodierter string den ich bekomme aus dem uralt elternsystem für das ich den viewer bastle so aus

1;0;derTextDerInDerBoxSteht

oder ein klebezettel:

0;13;DasIstEinKlebezettel

und ein Textmarker so:
2;2
bzw ein undurchsichtiges quadrat:
2:1
und ein stempel letztendlich
3;8

in wahrheit ist der string noch viel länger, weil auch noch andere informationen da drin stehen wie zb. hintergrundfarbe, textfarbe, textgröße, textstil (kursiv, fett etc.), border farbe, vordergrundfarbe, position und größe (Rectangle gesplittet in x,y, width, height)

also recht umständlich und blöd aber nunmal da und zu verwenden :(

jedenfalls soll es so sein das es eine "hauptklasse" annotation gibt, von der abgeleitet die klassen textbox, marker, stempel, leeres quadrat, gefülltes quadrat und natürlich klebezettel (undurchsichtiges quadrat mit border, hintergrundfarbe und text) gibt.

tja.... bislang ist mir aber nichts wirklich vernünftiges eingefallen diese einzelfälle irgendwie ordentlich voneinander zu unterscheiden und da vernünftige klassen draus zu machen.
viel schlimmer noch :

beim dekodieren der strings soll das ganze eine "AnnotationFactory" durchlaufen, die am ende Annotationen in den richtigen typen ausgibt.

so nach dem motto semikologetrennter string geht rein, klebezettel kommt raus.
aus diesem grund auch das konstrukt der gemeinsamen annotations oberklasse.....


hat da jemand ne idee wie ich das hin bekomme mit sinnvollen unterklassen?

bissher ist der einzige unterschied der, das marker und quadratannotationen halt keinen text haben, stempel klebezettel und textboxen schon.

:(
 
B

bygones

Gast
ohne mal wieder alles gelesen zu haben :)

Java bietet mit der Klasse BitSet schöne Bit - Operationen und einfaches und schnelles Bit-Spielen :)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben