Verständnis von PHP & amp; (Und-Zeichen, bitweise und) Operator
Verwende ich oft ($var & 1)
in meinem code, der true zurückgibt, wenn $var
eine ungerade Zahl ist und false, wenn es eine gerade Zahl ist.
Aber was bedeutet "&" eigentlich?
Kommentar zu dem Problem
Wäre es nicht gut, wenn man eine Antwort finden für beliebiger Programmierung Frage SO? Der einzige Weg, dies passieren würde, ist, wenn "einfache" Fragen gestellt bekommen, als auch als "puzzle" lieben. Auf dieser Grundlage, mich dünkt dies eine berechtigte Frage.
Unterschätzen Sie nicht die Anzahl der Menschen, die erfolgreich sind Programmierer, aber nicht wissen, was eine bitweise operation hat. Es ist eine berechtigte Frage und ein gründliches Verständnis hilft zu erklären, low-level-Funktionsweise von elektrischen schaltungen, Verschlüsselung und hashing, etc.
Natürlich habe ich versucht Google eine Antwort, bevor ich fragte. Hätte ich gewusst, dass das "&" - operator wurde als "bitweise", ich wäre in der Lage gewesen, etwas zu finden. Aber eine Suche nach "php &" oder "php & - operator" nicht auftauchen, was ich suchte.
... Nicht sagen, ist nicht in der Bedienungsanleitung, aber ich konnte nicht finden, dass es dann und kann es nicht finden auch jetzt noch. Ich versuche zur übung einige Grad der due diligence, bevor Sie Fragen stellen. Wenn Sie denken, eine Frage unnötig ist, warum geben eine harte Zeit? Antwort -, Stimm es nach unten oder verschieben auf.
Die Qualität der Antworten, die ich hier hatte (die detaillierten Erläuterungen auf binary) sind weit besser als die die ich finden konnte, in meine eigenen 15 Minuten recherche auf Google, PHP-docs und SO. Das ist, was macht diese Gemeinschaft, wie eine wertvolle Ressource.
InformationsquelleAutor der Frage chipotle_warrior | 2009-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
& ist binäre
and
. Wenn Sie einen binären Wert, und Sieand
mit einem anderen binären Wert, dann wird das Ergebnis der bitweisenand
von den beiden. Ein Beispiel:Dem niedrigstwertigen bit ist entweder eine 1 (und in diesem Fall die Zahl ist eine ungerade Zahl) oder ist es eine 0, in welchem Fall die Zahl selbst. Wenn Sie
&
eine Zahl mit 1 Sie sehen nur das, das am wenigsten signifikante bit, und die if prüft, ob die Zahl eine 1 oder eine 0. Wie andere erwähnt haben, betrachten Sie die bitweisen Operatoren für Informationen darüber, wie Sie arbeiten.InformationsquelleAutor der Antwort Marius
Zwei Vorgänge, die grundlegend sind, um binäre Systeme ODER und UND.
ODER bedeutet "wenn entweder A oder B". Ein reales Beispiel wäre zwei Schalter parallel. Wenn entweder um den Strom durch, dann Strom durch.
UND bedeutet 'sein, falls beide A und B auf'. Die Reale Welt Beispiel zwei Schalter in Serie. Strom wird nur Durchlaufen, wenn beide sind, so dass Strom durch.
In einem computer, das sind keine physikalischen Schalter, aber Halbleitern und Ihre Funktionalität sind aufgerufen Logik gates. Sie tun die gleichen Arten von Dingen, wie die Schalter reagieren auf Strom-oder kein Strom.
Angewandt auf ganze zahlen, jedes bit in einer Zahl kombiniert wird mit jedem bit in die andere Zahl. So verstehen die bitweisen Operatoren ODER und UND, müssen Sie zum konvertieren von zahlen in binäre, dann tun Sie das ODER oder UND-operation an jedem paar passenden bits.
Deshalb:
In der Erwägung, dass
Den (& 1) der Betrieb daher vergleicht die äußerst Rechte bit zu 1 mit UND-Logik. Alle anderen bits werden, werden effektiv ignoriert, weil alles UND nichts ist nichts. Eine gerade Zahl in Binär ist auch eine gerade Zahl, die in Dezimalschreibweise (10 ist ein Vielfaches von 2).
Andere grundlegende Operationen auf binären Systemen gehören, NICHT und XOR. NICHT bedeutet, "wenn Ein off' und ist die einzige form der Logik-Gatter, das dauert nur ein signal oder 'parameter', statt zwei. XOR bedeutet "wenn entweder A oder B, aber nicht beide". Und dann gibt es NAND, NOR und NXOR, die im Grunde nur NICHT in Kombination mit UND, ODER und XOR, dh NAND bedeutet "wenn A und B sind nicht beide auf'.
In der Programmierung, der Betreiber
Die andere kann sich um eine Kombination aus diesen, zum Beispiel:
PHP bestimmte note
Bitweise Operatoren arbeiten nicht auf der floating-point-Werte und in PHP-float-Werte werden implizit in Ganzzahlen konvertiert erste. Zahlen außerhalb des Bereichs, die ausgedrückt werden kann als ganze zahlen abgeschnitten werden, auf null - das heißt, alle zahlen über PHP_INT_MAX Aussehen wird "selbst" im Ausdruck
($num & 1)
). Wenn Sie unterstützen möchten, zahlen außerhalb der PHP_INT_MIN/PHP_INT_MAX, müssen Siefmod($num, 2)
. Wenn, jedoch, Sie sind auf 64-bit-PHP Ihre ganze zahlen haben eine größere Genauigkeit als Schwimmer sowieso.InformationsquelleAutor der Antwort thomasrutter
Dies ist auch interessant zu wissen, bitweise und PHP:
InformationsquelleAutor der Antwort Ólafur Waage
Ich weiß, Ihre Frage ist über das Verständnis der bitweisen operator und die akzeptierte Antwort erklärt es gut. Aber für das Beispiel, das Sie geben, ich kann mir nicht helfen, aber empfehlen, Sie verwenden den modulo-operator statt:
Weil es macht die Absicht deutlich, dass Sie überprüfen, dass die Anzahl ungerade (nicht teilbar durch zwei), und es ist generisch, so dass Sie verwenden können ($var % 3) auf die gleiche Art und Weise ableiten, wie es funktioniert für beliebige N.
InformationsquelleAutor der Antwort Pat
Zusätzlich zu den anderen Antworten, ist es erwähnenswert, dass
Nur rufen
func2()
wennfunc1()
gibt true zurück, ("lazy evaluation"), in der Erwägung, dassRufen beide Funktionen unabhängig, aber die Wahrheit Tabellen für beide werden die gleichen sein (vorausgesetzt, Sie kehren Boolesche Werte).
thomasrutter Punkte aus (unten in den Kommentaren), dass Sie wahrscheinlich nicht tun sollten letztere in der Praxis.
(A & B)
nicht unbedingt das gleiche truthiness als(A && B)
, besonders wennA
undB
ganze zahlen sind. z.B. wenn A=1 und B=2 (beide truthy), A & B werden falsey, in der Erwägung, dass A && B ist truthy. Auch andere Entwickler denken vielleicht, das ist ein Tippfehler und die "richtige" es, zwei kaufmännische und-Zeichen.InformationsquelleAutor der Antwort mpen