• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

X-Code Projekt | Mathe Syntax

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Liebe Community!

Ich habe jetzt schon Ewigkeiten nach einer sehr seltsamen Darstellung von Farben gesucht und bin durch keine vernünftige Rechnung auf das richtige Ergebnis gekommen.

{r,g,b,} ==> {190,190,190} wird in dieser "komischen" Darstellungsweise so ausgegeben: "12500670".

Ich bin nun in einem XCode Projekt auf die richtige Lösung gestoßen.
Nun kann ich mir allerdings nur teilweise vorstellen, wie das im "echten Leben" zu rechnen ist.
Nur das mit dem << 16 bzw. << 8wird mir nicht klar. Und das | weiß ich jetzt grad auch nicht mehr.

Der Code sieht so aus:
Code:
int colorInt = ((int)([bgColor redComponent]*255) << 16) | ((int)([bgColor greenComponent]*255) << 8) | ((int)([bgColor blueComponent]*255));

Kann mir vielleicht jemand von euch diese kleine Zeile erläutern?
Wäre echt spitzenmäßig!
Danke, liebe Grüße
 

Buhmi

Osnabrücker Reinette
Registriert
21.11.09
Beiträge
977
Die Zeile kann ich dir nicht erklären, aber in der Regel bedeutet << 16 den Wert im 32-Bit Feld um 16 bit nach links zu verschieben. Also aus
[0000 0000 0000 0001] wird [0000 0001 0000 0000]. So ist es zumindest in Assembler. Du schreibst also die Farbwerte ins obere Halbwort...
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
schau dir dazu mal das thema bitweise operatoren an.
http://de.wikipedia.org/wiki/Bitweiser_Operator
die doppelpfeile sind verschiebungsoperatoren. mit << verschiebst du bitweise nach links und mit >> nach rechts. der intwert (<< 16) gibt die weite an.
ließ dir mal den wikilink durch, da steht auch in einem beispiel bei wie man das gleiche ergebnis in dezimalschreibweise lösen kann.

muss aber gestehen das ich mit den kleinen scheissern auf kriegsfuß stehe.
 

karolherbst

Danziger Kant
Registriert
11.05.07
Beiträge
3.878
normalerweise würde man einen Pixel auch in einem struct oder Array abspeichern, wenn man in ObjC programmieren möchte.

zb.

Code:
typedef struct{
    CGFloat red;
    CGFloat gruen;
    CGFloat blau
} NSPixel;

und dann kann man ganz einfach einen initialisieren:

Code:
NSPixel tmp = {
        5.0,
        4.0,
        7.0
};

so braucht man auch keine doofen Bitoperatpren mehr usw...
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
normalerweise würde man einen Pixel auch in einem struct oder Array abspeichern, wenn man in ObjC programmieren möchte.

zb.

Code:
typedef struct{
    CGFloat red;
    CGFloat gruen;
    CGFloat blau
} NSPixel;
und dann kann man ganz einfach einen initialisieren:

Code:
NSPixel tmp = {
        5.0,
        4.0,
        7.0
};
so braucht man auch keine doofen Bitoperatpren mehr usw...

jetzt mal ganz dumm gefragt, wozu brauch ich eigentlich diese recht ungewöhnliche form der farbangabe. kenn mich in ObjC so gut wie garnicht aus. in anderen bereichen kam ich bislang immer mit RGB oder HEX aus. bin einfach nur neugierig!

und karol, was sind das für floatwerte in deinem struct? entsprechen die den RGB werten (wäre dann ja ein tiefes schwarz mit leichter blautendenz)? und was kannst du damit jetzt anfangen, bzw wie führ es jetzt zu dem zahlwert den der TS sucht?
Das auslesen von einzelnen pixeln hab ich schon öfter in flash gebraucht wenn ich webcambilder in flash aufnehmen wollte und als bilddatei speichern. aber da brauchte ich auch nur die normalen rgb werte.
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Ehrlich gesagt kenne ich diese recht eigentümliche Schreibweise der Farben auch nicht. Hab auch im Internet so gut wie nichts dazu gefunden, da ich nicht weiß, sich das nennt!
Ich bin im System von OS X drauf gestoßen und möchte nun damit umgehen.
Nur verstehe ich einfach nicht, was da aus den RGB Werten gemacht wird.
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Hmm.
Also das bitweise verschieben hat mir nicht wirklich geholfen…
Ich habe schon verstanden, worum es da geht.

Allerdings weiß ich immer noch nicht, wie ich auf diese blöde Farbdarstellung komme.
Ich kapiers einfach irgendwie nicht.
Gut. Ich müsste halt die Zahlen in Bits umschreiben, diese dann verschieben und weiter damit umgehen.

Klasse Idee… Schauen wir mal, wie sich das auf'm Papier mit hunderter Stellen macht :D
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
jetzt hats klick gemacht! naja ist ja noch kurz vor ende des ersten kaffees;)
das es ne binärzahl ist war mir von anfang an klar, hab sie nur nicht in bin umgerechnet
hinter deiner zahl oben verbrigt sich (binär ausgegeben): 101111101011111010111110
die darstellung von farben wird in 24 bzw 32 bit gemacht. die ersten 8 für rot, dann 8 für grün weitere 8 für blau und die letzten geben den alphawert an.
bei "lokalen" anwendungen wie ner app in ObjC ist es einfach resourcenschonender auf bitbasis zu arbeiten. deswegen ist der von buhmi verwendete assembler auch so scheisse schnell. wenn ein system informationen direkt im "maschinencode" bekommt muss nicht erst mühsam umgerechnet werden.
Das erklärt auch wieso ich das vorher noch nie brauchte;) im web ist halt alles für "doofe" weiß nichtmal ob ein browser mit binärangaben was anfangen könnte. würde aber mal auf nö tippen.

was genau wolltest du damit machen, bzw in welchem bereich brauchst du das?
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
Hmm.
Also das bitweise verschieben hat mir nicht wirklich geholfen…
Ich habe schon verstanden, worum es da geht.

Allerdings weiß ich immer noch nicht, wie ich auf diese blöde Farbdarstellung komme.
Ich kapiers einfach irgendwie nicht.
Gut. Ich müsste halt die Zahlen in Bits umschreiben, diese dann verschieben und weiter damit umgehen.

Klasse Idee… Schauen wir mal, wie sich das auf'm Papier mit hunderter Stellen macht :D

naja so schlimm ist das mit dem umrechnen garnicht. wie oben schon geschrieben wird jeder farbwert (R G & B) ja in 8 bit angegeben. und die verschiebung bedeutet in dem fall einfach nur das die erste farbe 16bit nach links geschoben wird, damit den ersten farbwert (erster 8bit block) "1011 1110" darstellt, dann der zweite 8bit "1011 1110"nach links geschoben wird dementsprechend auf den ersten 8 bit block folgt = "1011 1110 1011 1110". und das ganze spielchen noch mit der blauangabe "1011 1110" die keine verschiebung hat, was dann zusammen "1011 1110 1011 1110 1011 1110" macht.

dieses entspricht der 24bit farbangabe die verbleibenen 8 bit sind für transparenzen und müssen in diesem fall nicht angegeben werden.
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Ich möchte lediglich ( !! :) ) eine Farbe wählen und diese in diesen "eigenartigen" Farbcode umrechnen. Also scheinbar ein dezimal dargestellter binärcode (?!)

Und das ganze soll dann im System verwendet werden.
Aber vielleicht bekomme ich das jetzt im Command line hin...
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
genau das ist es!
in php ist es simpel wobei ich die angabe in dem snippet von dir nicht verstehe. denn dort wird mit 255 gerechnet auf den gleichen binärwert komm ich nur bei 256. was ja auch eigentlich logisch ist da 2^8 = 256 sind.

probier mal folgendes: (die 190 sind dein wert den du oben angegeben hast)
((190*256)<<8)|((190*256)<<0)|((190*256)>>8) -> 24bit in dec = 12500670
oder
((190*256)<<16)|((190*256)<<8)|((190*256)) -> 32bit in dec = -1094795776

in dem zweiten fall sind die letzten 8 bit 0 das "verreisst" den decimalwert bei der ausgabe hat aber den gleichen binärwert
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Wo genau soll ich das denn eingeben?
Bzw. mit welchem Befehl voraus, wenn ich im Command Line bin (z.B.)?
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
@@das_micha.
Rechner fangen bei 0 an zu zählen. Daher hat MAXINT 255.

@@Mini-Leopard
Ich verstehe deine Eingangsfrage nicht. Was ist das Problem? Und was ist die Ausgangslage.
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Also irgendwie steh ich mit der gesamten Geschichte total auf'm Schlauch.
Zwischenzeitlich hatte ich es schon fast.

Dann fällt mir aber auf, dass sich die Werte im Laufe zwischen 0 und 255 verschieben.
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
RGB-Farbkomponenten setzen sich üblicherweise aus 3 int zusammen. Wertebereich: 0 - 255 .
Aber Quartz arbeitet komplett mit floats, genauer CGfloat. Wertebereich: 0,0 - 1,0 .

P.S.: Es wurde von Buhmi auch schon erklärt was in der Codezeile passiert; und karolherbst wie sich die Komponenten beispielhaft zusammensetzen.


Was ist denn noch unklar? Oder was geht nicht?
 
Zuletzt bearbeitet:

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
@@das_micha.
Rechner fangen bei 0 an zu zählen. Daher hat MAXINT 255.

@@Mini-Leopard
Ich verstehe deine Eingangsfrage nicht. Was ist das Problem? Und was ist die Ausgangslage.

Das die werte von 0-255 gehen ist mir schon klar, da es sich aber um ne mathematische operation handelt, sowohl in dem vom TS geposteten snippet als auch bei meiner PHP operation, muss ich aber, zumindest in meinem "rechenbeispiel" von den vollen 2^8 also 256 ausgehen da ich sonst andere binärwerte bekomme. und wenn ich von dem 190er grau ausgehe und das mit 255 rechne, inkl shifting kommt ein türkis raus. ich darf doch davon ausgehen das mathematische operationen eigentlich sprachübergreifend gleich gehandhabt werden oder?
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
So.
Jetzt bin ich endlich zu meinem Ergebnis gekommen :)

Die Ausgangslage ist RGB im Werteraum 0-255.
Und Das soll ist ein RGB Int.

Folgendermaßen wird das gerechnet (mehr wollte ich nicht wissen :) )
(256 * 256 * rot + (256 * grün) + blau)


Vielen Dank euch trotzdem für die Hilfe.
Hat mir in ein paar Dingen Klarheit geschaffen.
Liebe Grüße
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
So.
Jetzt bin ich endlich zu meinem Ergebnis gekommen :)

Die Ausgangslage ist RGB im Werteraum 0-255.
Und Das soll ist ein RGB Int.

Folgendermaßen wird das gerechnet (mehr wollte ich nicht wissen :) )
(256 * 256 * rot + (256 * grün) + blau)


Vielen Dank euch trotzdem für die Hilfe.
Hat mir in ein paar Dingen Klarheit geschaffen.
Liebe Grüße

stimmt, so hauts auch auch rein dezimalem weg hin und sieht auch viel einfacher aus...
ergebnis ist das gleiche;)
na dann viel spaß weiterhin!
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Jetzt weiss ich wenigstens, dass er eigentlich nur ein paar bytes in einen long stecken wollte.
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
Jetzt weiss ich wenigstens was er eigentlich wollte. Nur ein paar bytes in einen long stecken.

hihi;)
aber nun sag doch bitte nochmal was zu meiner frage. da das ziel ja die ganze zeit der binärwert einer farbe war, lieg ich da nun falsch mit meinen 256 oder ist in dem snippet ganz am anfang einfach nur ein fehler drin (was ich vermute, auch wenn ich nicht weiß was in den zu miltiplizierenden werten steht)?