Logische Ausdrücke (für Spezis)
Andavos
- php
0 Tom0 lulu0 Christian Seiler
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
Hello,
hast Du schon http://de3.php.net/manual/en/language.operators.php angeschaut?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
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
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
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
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
Huhu Andavos
hmm gut, hättest du ne Idee wie man die Eingabe und Ausgabe als Binär angibt?
oder auch
printf ('%b', 255);
Viele Grüße
lulu
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
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
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
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
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
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
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
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
Christian
Hallo,
| ist der logische OR-Operator
Ähm Sorry, der bitweise OR-Operator. Der logische OR-Operator ist ||.
Viele Grüße,
Christian
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
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