Heizer: Bitmask auslesen

Liebes Forum

Ich möchte eine Bitmaske auslesen.

Ich möchte es an einem Beispiel demonstrieren:

imagewriteHeadline($str,$output) {
  // Diese Funktion erzeugt eine Überschrift als Grafik
}

$output soll nun so gesetzt werden, daß entweder ein GIF oder ein PNG oder ein JPEG oder eine Kombination aus diesen geschrieben oder zurückgegeben wird. Ich denke mir also:
RETURN = 0
WRITE = 1
GIF = 2
PNG = 4
JPEG = 8

$output kann also werte von 1 - 15 haben (das kann sich aber natürlich noch erweitern). Meine Frage ist also, ob jemand eine allgemeine Funktion weiß, mit der ich diese Bitwerte einzeln bekomme.

Eine idee, wie die Rückgabe aussehen könnte, wäre ein Array mit allen gesetzen bits.

$output = 3;
 => array(1,2); // schreibt ein GIF Bild

$output = 10;
 => array(2,8); // gibt ein GIF und ein JPEG zurück

$output = 14;
 => array(2,4,8); // gibt ein GIF, PNG und JPEG zurück

Kann mir jemand eine soche Funktion nennen oder mir zumindest einen Denkansatz liefern, wie man so etwas schreiben kann? Wie gesagt, sie soll mit beliebigen Bitwerten umgehen können.

Danke und ein frohes neues

Heizer

  1. 你好 Heizer,

    $output soll nun so gesetzt werden, daß entweder ein GIF oder ein PNG
    oder ein JPEG oder eine Kombination aus diesen geschrieben oder
    zurückgegeben wird. Ich denke mir also:
    RETURN = 0
    WRITE = 1
    GIF = 2
    PNG = 4
    JPEG = 8

    $output kann also werte von 1 - 15 haben (das kann sich aber
    natürlich noch erweitern). Meine Frage ist also, ob jemand eine
    allgemeine Funktion weiß, mit der ich diese Bitwerte einzeln bekomme.

    Die Funktion ist ganz einfach: du gehst alle Bits durch und pruefst, ob
    es gesetzt ist. Kann man z. B. so machen:

    function test($var) {
      $max = 32;
      $ret = Array();

    for($i=0;$i<$max;++$i) {
        $val = (1<<$i);

    if($var & $val) $ret[] = $val;
      }

    return $ret;
    }

    var_dump(test(1|2|4));

    Ich bin von 32 ausgegangen, weil 32 Bit-Rechner normal sind. Bei 64
    Bit-Maschinen muss man $max eventuell hoeher setzen, um alle Bits
    abzudecken, aber 32 Bit sollten eigentlich fuer alle Masken reichen.

    再见,
     CK

    --
    Der Verstand ist der Hausherr, der Koerper sein Gast.
    http://wwwtech.de/
    1. Ich danke dir, nach kurzer Lektüre und Spielerei habe ich nun endlich die Bit Operatoren verstanden.

      Der erste gute Vorstatz für das neue Jahr ist damit erfüllt :)

      grüße

      Heizer