Invisible: Hex Kombination rückgänig machen ?

Hi,

also wir haben eine reihe von Möglichen HEX werten:

[code lang=perl0x0001
0x0002
0x0004
0x0008
0x0010
0x0020
0x0040
0x0080
0x0100
0x0200
0x0400
0x0800
0x1000[/code]

welche alle einen bestimmten zustand beschrieben. Nun können sich die Zustände aber auch mischen.

z.b.:
(0x0008 & 0x0004) = 0x000C
(0x0008 & 0x0004 & 0x0800) = 0x080C

Wie kann ich jetzt aber eine function  schreiben welche mir aus der neuen Zahl (0x080C) wieder die einzelenen zustände macht ?

mfg Invisible

  1. (0x0008 & 0x0004) = 0x000C
    (0x0008 & 0x0004 & 0x0800) = 0x080C

    Wie kann ich jetzt aber eine function  schreiben welche mir aus der neuen Zahl (0x080C) wieder die einzelenen zustände macht ?

    Garnicht, da du ein logisches Problem hast

    Woher soll die Funktion (oder ein Mensch) wissen, ob 0x000C jetzt aus 0x0008 & 0x0004 oder aus 0x0004 & 0x0004 & 0x0004 oder aus 0x0002 & 0x0002 & 0x0004 besteht? Von alle anderen Kombinanten reden wir besser nicht :)

    1. Garnicht, da du ein logisches Problem hast

      nvm, ich hatte ein logisches Problem :)

  2. Hi Invisible!

    Wie kann ich jetzt aber eine function  schreiben welche mir aus der neuen Zahl (0x080C) wieder die einzelenen zustände macht ?

    Diese Funktion gibt es schon. Wenn du einen Basiswert mit einem gemischten Zustandswert bitweise ODER verknüpfst, bekommst du entweder diesen Basiswert oder 0 zurück.
    Wichtig ist, dass die Basiswerte voneinander linear unabhängig sind.

    Mit 16 Bit stehen dir also maximal 16 Basiswerte zur Verfügung.

    Wofür willst du die Werte eigentlich wieder auseinanderpfriemeln?
    Es reicht, wenn du den zusammengesetzten Wert für Vergleiche zur Verfügung hast.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hört sich interessant an ... und wie würde eine abfrage danach aussehen ?
      Also wenn ich jetzt z.b. wissen möchte ob der Zustand 0x0800 zutreffend ist ?

      1. Hört sich interessant an ... und wie würde eine abfrage danach aussehen ?
        Also wenn ich jetzt z.b. wissen möchte ob der Zustand 0x0800 zutreffend ist ?

        print $zahl & 0x0800 ? 'ja' : 'nein';
        Struppi.

      2. Hi Invisible!

        Hört sich interessant an ... und wie würde eine abfrage danach aussehen ?
        Also wenn ich jetzt z.b. wissen möchte ob der Zustand 0x0800 zutreffend ist ?

        Am besten wird das klar, wenn du die Bit ausschreibst. Der Einfachheit halber nehme ich aber ein kürzeres Beispiel (PHP, da ich in Perl nicht sattelfest bin):

        // Buttons  
        $definedButtons = array();  
        $definedButtons['OK'] = 0x0001;      // 0001  
        $definedButtons['CANCEL'] = 0x0002;  // 0010  
        $definedButtons['YES'] = 0x0004;     // 0100  
        $definedButtons['NO'] = 0x0008;      // 1000  
          
        // beliebige Linearkombination der 4 Basiswerte  
        $buttons = 13;                       // 1101  
          
        $out = array();  
        foreach($definedButtons as $key => $definedButton)  
        {  
          // UND-Verküpfung ergibt entweder 0 (false) oder den Wert $definedButton (true)  
          if($definedButton & $buttons)  
            $out[] = $key;  
        }  
          
        echo 'Folgende Buttons sollen genutzt werden: '.implode(', ',$out);
        

        Und natürlich hatte ich Mist erzählt. Wichtig ist, dass die Werte mit UND verknüpft werden.
        ODER ist für die Erstellung des zusammengesetzten Zustands relevant.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  3. (0x0008 & 0x0004) = 0x000C
    (0x0008 & 0x0004 & 0x0800) = 0x080C

    Sprachlich gesehen stimmts, aber mit logischem UND (also so wie es da steht) kommt dabei 0 raus. Nur damit du dich nicht wunderst warums nicht geht.
    Der Rest steht ja schon in den anderen Antworten.