Andavos: Logische Ausdrücke (für Spezis)

Hallo,
hab ein paar Probleme mit Logischen Ausdürcken, sofern es welche sind.

Wollte mal fragen, welche Funktion folgender Scriptabschnitt hat:
$right ^= $temp;

Und dann noch das hier:
$temp = ($this->zeroFill($left,16) ^ $right) & 0x0000ffff;

zeroFill ist eine Funktion, aber ich würde gerne wissen was ^ und & macht. Ich glaube nicht das ^ für Hoch steht.

Und noch:
$a >>= 1;
$a &= (~ $z);
$a |= 0x40000000;
$a >>= ($b-1);

Das sind Teile aus einer DES Implementierung in PHP

MFG
Andavos

  1. Hello,

    hast Du schon http://de3.php.net/manual/en/language.operators.php angeschaut?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  2. Huhu Andavos

    hab ein paar Probleme mit Logischen Ausdürcken, sofern es welche sind.

    Nein, es sind keine

    http://de3.php.net/manual/en/language.operators.bitwise.php

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hallo,
      danke.

      Hab aber das nächste Problem:

      <?php
      $temp = 10110100;

      echo $temp;
      echo "<br>";
      $left = $temp << 1;
      echo $left;
      ?>

      Also ich möchte 10110110 um 1 Bit nach links verschieben, aber als Ausgabe erhalte ich
      20220200

      Aber eigentlich soll da 01101001 rauskommen.

      Danke

      1. Hello,

        Hab aber das nächste Problem:

        <?php
        $temp = 10110100;

        echo $temp;
        echo "<br>";
        $left = $temp << 1;
        echo $left;
        ?>

        Also ich möchte 10110110 um 1 Bit nach links verschieben, aber als Ausgabe erhalte ich
        20220200

        Sorry, aber jetzt habe ich laut gelacht. Das Problem hatte ich auch mal irgendwann... ;-)

        Wenn Du in PHP eine Zuweisung:  $temp = 10110100; machst, dann hast Du der variablen temp die Deziamalzahl Zehnmillioneneinhundertzehntaussendeinhundert zugewiesen. Wenn Du die um ein bit nach links verschiebst, dann multiplizierst Du die Zahl mit zwei. Das Ergebnis wurde Dir dann auch wieder dezimal angezeigt.

        Das liegt natürlich daran, dass Dezimalzahlen im Computer als Strings angezeigt werden. Dieser String wird dann, sofern er ohne Häkchen eingegeben wurde, als Dezimalzahl umgewandelt. Diese Dezimalzahl wird dann aber intern als Bitmuter gespeichert. Erst mit dieser Binärzahl wird dann "gerechnet".

        Du musst Dir also immer im klaren sein, wie DU die Zahl siehst, wie der Parser sie sieht und sie dann an den Compiler weiterleitet.

        Harzliche Grüße aus <http://

        www.annerschbarrich.de>

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo,
          hmm gut, hättest du ne Idee wie man die Eingabe und Ausgabe als Binär angibt?

          Also es wäre gut, wenn man die Variable so bestimmt, dass man ihr sagt, dass sie einen Binären-Inhalt hat, und keinen Dezimal.

          Danke

          1. Huhu Andavos

            hmm gut, hättest du ne Idee wie man die Eingabe und Ausgabe als Binär angibt?

            http://de3.php.net/decbin

            oder auch

            printf ('%b', 255);

            Viele Grüße

            lulu

            --
            bythewaythewebsuxgoofflineandenjoytheday
          2. Hello,

            hmm gut, hättest du ne Idee wie man die Eingabe und Ausgabe als Binär angibt?

            Also es wäre gut, wenn man die Variable so bestimmt, dass man ihr sagt, dass sie einen Binären-Inhalt hat, und keinen Dezimal.

            Dafür gibt es unter "Variablen" bei PHP einige Funktionen
            http://de3.php.net/manual/de/ref.variables.php

            Und die shift-left (shl) und shift-right (shr) Funktion kann man rein optisch natürlich auch mit dem String durchführen. Die Regel heißt dann, den Substring zu benutzen und das wegfallende Digit an der anderen Seite durch 0 zu ersezten

            shr 11110000  wird zu 01111000
              shl 00111100  wird zu 01111000

            Und damit kann man dann nachher binär weiterrechnen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hello,

              Dafür gibt es unter "Variablen" bei PHP einige Funktionen
              http://de3.php.net/manual/de/ref.variables.php

              besser: http://de3.php.net/manual/de/ref.math.php

              habe ich doch glatt die falschen erwischt

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Hallo,
                hmm das geht auch nicht:
                echo decbin(10) << 1;

                Ausgabe ist immer noch 2020 (aus 1010) anstatt 0101.

                Muss ich evt. eine andere Funktion benutzen?

                MFG
                Andavos

                1. Hallo Andavos,

                  hmm das geht auch nicht:
                  echo decbin(10) << 1;

                  Ausgabe ist immer noch 2020 (aus 1010) anstatt 0101.

                  Muss ich evt. eine andere Funktion benutzen?

                  echo decbin (bindec (10) << 1));

                  Viele Grüße,
                  Christian

                  1. Hallo,
                    hmm das geht nicht.

                    Erhalte eine Fehlermeldung:
                    Parse error: parse error, unexpected ')', expecting ',' or ';' in C:\apache\htdocs\php\kryptografie\unbenannt.php on line 13

                    Wenn ich das so umschreibe:
                    echo decbin (bindec (10) << 1);

                    Erhalte ich als Ausgabe 100 und nicht (0)101 wie es eigentlich seinen sollte.

                    MFG
                    Andavos

                    1. Hallo Andavos,

                      hmm das geht nicht.

                      Ups. Man sollte Code vorher testen.

                      Wenn ich das so umschreibe:
                      echo decbin (bindec (10) << 1);

                      Korrekt.

                      Erhalte ich als Ausgabe 100 und nicht (0)101 wie es eigentlich seinen sollte.

                      100 ist korrekt. Wieso sollte das (0)101 sein?

                      Du hast die Zahl 10. Die verschiebst Du um 1 Bit nach links:

                      +-+-+-+
                         | |1|0| Original
                         +-+-+-+
                         |1|0| | Um 1 nach links verschoben
                         +-+-+-+
                         |1|0|0| Mit 0 aufgefüllt.
                         +-+-+-+

                      Viele Grüße,
                      Christian

                    2. hi,

                      Wenn ich das so umschreibe:
                      echo decbin (bindec (10) << 1);

                      Erhalte ich als Ausgabe 100 und nicht (0)101 wie es eigentlich seinen sollte.

                      willst du dich nicht erst mal ein bisschen mit den grundlagen des binärsystems beschäftigen ...?

                      gruß,
                      wahsaga

                      --
                      "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
  3. Hallo Andavos,

    zeroFill ist eine Funktion, aber ich würde gerne wissen was ^ und & macht. Ich glaube nicht das ^ für Hoch steht.

    ^ und & sind Bitoperatoren. D.h. für jedes Bit der beiden angegebenen Variablen / Werte wird dieser Operator angewendet. ^ ist XOR, & ist AND.

    Folgende Tabelle stellt dar, was bei einzelnen Bits passiert:

    Wert 1    |   Wert 2   |   Ergebnis (XOR)
    -----------+------------+--------------------
     0         |   0        |   0
     0         |   1        |   1
     1         |   0        |   1
     1         |   1        |   0

    Wert 1    |   Wert 2   |   Ergebnis (AND)
    -----------+------------+--------------------
     0         |   0        |   0
     0         |   1        |   0
     1         |   0        |   0
     1         |   1        |   1

    Damit ist bei zwei Zahlen aus 3 Bits folgendes gegeben:

    001 XOR 101 = 100
    001 AND 101 = 001

    Und noch:
    $a >>= 1;

    $a >>= 1; ist das gleiche wie $a = $a >> 1;

    Der >>-Operator verschiebt die Bits alle nach rechts. In diesem Fall um 1; $a >>= 2; würde den Inhalt von $a um 2 nach rechts verschieben usw.

    Wenn Du eine Zahl, die aus einem Byte besteht, hast, dann passiert folgendes:

    Urpsprungszahl:                   01000100
      Um eins nach rechts verschoben:    0100010
      Mit 0 aufgefüllt:                 00100010

    $a &= (~ $z);

    ~ ist der Negierungsoperator (NOT), da werden alle Bits vertauscht. Bitweise betrachtet gilt:

    NOT 1010 = 0101

    $a &= ...; ist das gleiche wie $a = $a & ...;

    & ist der AND-Operator. (s.o.)

    $a |= 0x40000000;

    $a = $a | 0x40000000;

    0x40000000 ist eine Hex-Zahl und steht für 1073741824 dezimal oder 1000000000000000000000000000000 binär. | ist der logische OR-Operator mit folgender Tabelle:

    Wert 1    |   Wert 2   |   Ergebnis (OR)
    -----------+------------+--------------------
     0         |   0        |   0
     0         |   1        |   1
     1         |   0        |   1
     1         |   1        |   1

    $a >>= ($b-1);

    Hier wird $a um $b-1 nach rechts verschoben. (s.o.)

    Siehe auch: http://de3.php.net/manual/de/language.operators.bitwise.php.

    Viele Grüße,
    Christian

    1. Christian
      Hallo,

      | ist der logische OR-Operator

      Ähm Sorry, der bitweise OR-Operator. Der logische OR-Operator ist ||.

      Viele Grüße,
      Christian

    2. Hallo Christian,

      $a &= (~ $z);

      ~ ist der Negierungsoperator (NOT), da werden alle Bits
      vertauscht.

      Hm. Negierungs-Operator gefaellt mir nicht, auch in der Dokumentation
      nicht. Bei einer Negierung erwarte ich, dass das Ergebnis hinterher
      das Gegenteil dessen ist, was es vorher war (true oder false).
      Der ~-Operator bildet das »B-1«-Komplement, also das Muster, dass
      man zu einer Zahl addierne muss, um ein vollstaendiges 1er-Muster zu
      bekommen.

      Uebrigens wird der Ausdruck oben benutzt, um ein bestimmtes Bitmuster
      auszuschalten:

      $a sei 11011001 binaer
      $z sei 10000000 binaer

      $a &= (~ $z) heisst dann $a = 11011001 & (~10000000) heisst dann
      11011001 & 01111111 was damit 01011001 ist (das in $z gesetzte Bit
      ist jetzt ausgeschaltet).

      $a |= 0x40000000;

      $a = $a | 0x40000000;

      0x40000000 ist eine Hex-Zahl und steht für 1073741824 dezimal oder
      1000000000000000000000000000000 binär.

      Wuerde man in C der besseren Lesbarkeit wegen allerdings eher so
      schreiben:

      1<<30

      denn nichts anderes will man ja mit dieser Zahl: das 30e Bit auf
      1 gesetzt. In PHP wuerde der Bitshift allerdings jedesmal
      ausgefuehrt, deshalb schreibt man da bereits die richtigen[tm]
      Zahlen hin.

      Grüße,
       CK

      --
      Nur die Weisesten und die Dümmsten können sich nicht ändern.
      http://wwwtech.de/
      1. Moin!

        ~ ist der Negierungsoperator (NOT), da werden alle Bits
        vertauscht.

        Hm. Negierungs-Operator gefaellt mir nicht, auch in der Dokumentation
        nicht. Bei einer Negierung erwarte ich, dass das Ergebnis hinterher
        das Gegenteil dessen ist, was es vorher war (true oder false).

        Ist es doch auch. Jedes Bit wird negiert, es ist hinterher genau anders gesetzt, als vorher.

        Der ~-Operator bildet das »B-1«-Komplement, also das Muster, dass
        man zu einer Zahl addierne muss, um ein vollstaendiges 1er-Muster zu
        bekommen.

        Das ist eine nette, kompliziertere Umschreibung für exakt dasselbe. :)

        Beachte übrigens, dass es hier nicht um irgendwelche vorzeichenbehaftete Binärarithmetik geht (das würde die Sache nochmal komplizierter machen :) ).

        - Sven Rautenberg