crazyPower: Bitmuster; Fehler beim Vergleich

Hallo,

ich bin etwas verwirrt. Ich habe folgenden Code:

$result=array("ZUGRIFF" => array(0=>3333));
print_r($result);
echo "<br>";
for ($i=0; $i<17; $i++){
   if($result['ZUGRIFF'][0] & $i){
      echo "$i: checked\n<br>";
   }
}

echo base_convert($result['ZUGRIFF'][0], 10, 2);

Und das hier als Ausgabe:
Array ( [ZUGRIFF] => Array ( [0] => 3333 ) )
1: checked
3: checked
4: checked
5: checked
6: checked
7: checked
9: checked
11: checked
12: checked
13: checked
14: checked
15: checked

110100000101

Eigentlich dürfte er doch in diesem Fall nur bei 0, 2, 8, 10, 11 ein "checked" bringen.

Die Bits 1, 3, 5, 6, 7, 9, 11, 12, 13, 14, 15 sind doch bei der Dezimalzahl 3333 garnicht gesetzt. Wenn sie gesetzt wären, müsste das die Dezimalzahl 64250 sein....

ein etwas verwirrter

cP

  1. Moin!

    $result=array("ZUGRIFF" => array(0=>3333));
    print_r($result);
    echo "<br>";
    for ($i=0; $i<17; $i++){
       if($result['ZUGRIFF'][0] & $i){

    Du vergleichst hier die Integerzahl 3333 mit den Integerzahlen von 1 bis 17, indem du das Ergebnis der UND-Operation auswertest. Manche dieser Operationen liefern logisch TRUE, manche logisch FALSE - entsprechend ist dein Ergebnis.

    echo "$i: checked\n<br>";
       }
    }

    • Sven Rautenberg
    1. Danke für die Erklärung.

      Wie aber sonst kann ich ein Vergleich auf Bitebene machen?

      das PHP-Manual sagt nämlich:
      Beispiel     Erklärung
      $a & $b      Bits, die in $a und $b gesetzt sind werden gesetzt.

      Ich muss doch dann keine Binärzahl angeben, oder?
      Der o.g. Vergleich funktioniert übrigens mit gewünschtem Ergebnis mit JavaScript.

      Danke

      cP

      1. Moin!

        Danke für die Erklärung.

        Wie aber sonst kann ich ein Vergleich auf Bitebene machen?

        Genau so.

        Aber es ist ein Unterschied (nämlich in der notwendigen Integerzahl $b), ob du ein AND mit der Zahl 10 machst, oder mit einer Zahl, deren zehntes Bit gesetzt ist - das ist nämlich die Integerzahl 1024.

        das PHP-Manual sagt nämlich:
        Beispiel     Erklärung
        $a & $b      Bits, die in $a und $b gesetzt sind werden gesetzt.

        Ist korrekt.

        Aber wenn du 3333(dez) mit 10(dez) AND-verknüpfst, dann passiert:

        110100000101
        000000001010
        ------------
        000000000000 = 0 (dez) = false

        Die Verknüpfung von 3333 und 9:
        110100000101
        000000001001
        ------------
        000000000001 = 1(dez) = true

        Ich muss doch dann keine Binärzahl angeben, oder?

        Du mußt die Dezimalzahl angeben, deren Bit passend gesetzt ist. Beim zehnten Bit eben 2^10 = 1024

        110100000101
        010000000000
        ------------
        010000000000 = 1024(dez) = true

        Der o.g. Vergleich funktioniert übrigens mit gewünschtem Ergebnis mit JavaScript.

        Code bitte! Dann siehst du den Unterschied wahrscheinlich.

        • Sven Rautenberg
        1. Hallo,

          manchmal hat man ein Brett vorm Kopf. Vorgestern habe ich die JS-Funktion geschrieben. Dort auch korrekt (mit math.pow(2, i)).
          Heute schreibe ich eine ähnliche ohne 2^i, und wundere mich, wieso das alles nicht so funktioniert, wie ich mir das vorstelle!

          Danke