Frage

Ich habe oft verwenden ($var & 1) in meinem code gibt true zurück, wenn die $var eine ungerade Zahl ist und false, wenn es eine gerade Zahl ist.

Aber was bedeutet "&" eigentlich?

War es hilfreich?

Lösung

& Binär and.Wenn Sie einen binären Wert, und Sie and mit anderen binären Wert, dann wird das Ergebnis der bitweise and von den zwei.Ein Beispiel:

  01101010
& 01011001
= 01001000

Das bit ganz rechts ist entweder eine 1 (und in diesem Falle ist die Zahl eine ungerade Zahl ist) oder es ist eine 0, in welchem Fall die Zahl gerade ist.Wenn Sie & eine Zahl mit 1, Sie sehen nur das niederwertigste bit und das if prüft, ob die Zahl eine 1 oder eine 0.Wie andere erwähnt haben, schauen Sie auf die bitweisen Operatoren für Informationen, wie Sie funktionieren.

Andere Tipps

Zwei Operationen, die von grundlegender Bedeutung sind binäre Systeme sind OR und AND.

oder bedeutet ‚wenn entweder A oder B eingeschaltet ist auf‘. Ein Beispiel aus der Praxis würde zwei Schalter parallel sein. Wenn entweder erlaubt ist Strom durch, dann fließt Strom durch.

und bedeutet ‚wenn sowohl A als auch B auf‘ ist. Das reale Welt Beispiel ist zwei Schalter in Serie. Strom wird nur passieren, wenn beide erlauben Strom durch.

In einem Computer, sind diese nicht physischer Switches aber Halbleiter und ihre Funktionalität wird Logikgatter genannt . Sie haben die gleiche Art von Dingen wie die Schalter - reagieren auf Strom oder kein Strom

.

Wenn auf ganze Zahlen angewandt wird jedes Bit in einer Reihe mit jedem Bit in der anderen Reihe kombiniert. So die Bit-Operatoren zu verstehen, OR und AND, müssen Sie die Zahlen in binären konvertieren, dann die OR tun oder UND-Operation auf jedem Paar von Bits entsprechen.

Das ist der Grund:

00011011 (odd number)
AND
00000001 (& 1)
== 
00000001 (results in 1)

Die

00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)

Der (& 1) Betrieb vergleicht daher die am weitesten rechts stehende Bit auf 1 mit UND-Logik. Alle anderen Bits werden effektiv ignoriert, weil alles und nichts ist nichts. Eine gerade Zahl in binärer ist auch eine gerade Zahl in Dezimalschreibweise (10 ist ein Vielfaches von 2).

Weitere grundlegende Operationen auf binäre Systeme umfassen NOT und XOR. NICHT bedeutet ‚wenn A off‘ und ist die einzige Form von Logikgattern, das nur ein Signal oder ‚Parameter‘ anstelle von zwei erfolgt. XOR bedeutet ‚wenn entweder A oder B eingeschaltet ist, aber nicht beide‘. Und dann gibt es NAND, NOR und NXOR, die grundsätzlich nur NICHT kombiniert mit AND, OR und XOR, dh NAND bedeutet 'wenn A und B nicht beide auf'.

Bei der Programmierung der Operator

& means AND,
| means OR, 
~ means NOT, and
^ means XOR.

Die anderen können durch die Kombination von diesen hergestellt werden, zum Beispiel:

~ (a & b) is equivalent to a NAND operation

PHP Spezifischer Hinweis

Bit-Operatoren arbeiten nicht auf Gleitkommazahlen und in PHP Float-Werte werden implizit zuerst auf ganze Zahlen umgewandelt werden. Zahlen außerhalb des Bereichs, die ausgedrückt werden kann als ganze Zahlen auf Null gekürzt werden - das heißt, alle Zahlen über PHP_INT_MAX aussehen wird „auch“ im Ausdruck ($num & 1)). Wenn Sie Zahlen zur Unterstützung außerhalb von PHP_INT_MIN / PHP_INT_MAX wollen, müssen Sie fmod($num, 2). Wenn aber sind Sie auf 64-Bit-PHP Ihre ganze Zahlen wird größer haben Präzision als Schwimmer sowieso.

Das ist auch interessant zu wissen, über bitweise und PHP:

/**
 * Regular
 */
echo (true && true); // 1
echo (true && false); // nothing

echo (true || false); // 1
echo (false || false); // nothing

echo (true xor false); // 1
echo (false xor false); // nothing

/**
 * Bitwise
 */
echo (true & true); // 1
echo (true & false); // 0

echo (true | false); // 1
echo (false | false); // 0

echo (true ^ false); // 1
echo (false ^ false); // 0

Zusätzlich zu den anderen Antworten, es ist erwähnenswert, dass

if(func1() && func2())

Wird nur nennen func2() wenn func1() true zurückgibt ( "lazy evaluation"), während

if(func1() & func2())

Werden beide Funktionen aufrufen, unabhängig, aber die Wahrheitstabellen für beide die gleiche sein (vorausgesetzt, sie zurückkehren booleans).


thomasrutter weist darauf hin (in den Kommentaren unten), die Sie wahrscheinlich nicht diese in der Praxis tun sollten. (A & B) nicht unbedingt die gleiche Iness wie (A && B), vor allem, wenn A und B ganzen Zahlen sind. beispielsweise, wenn A = 1 und B = 2 (beide truthy), A & B wird Falsey sein, wohingegen ein && B truthy ist. Auch kann denken, ein anderer Entwickler ist dies ein Tippfehler und ‚richtige‘ es zwei Et-Zeichen.

Ich weiß, dass Ihre Frage ist der bitweise Operator über das Verständnis und die akzeptierte Antwort erklärt es gut. Aber für das Beispiel, das Sie geben, ich kann nicht helfen, aber zu empfehlen verwenden Sie den Modulo-Operator statt:

($var % 2) /* instead of */ ($var & 1)

Weil es macht die Absicht deutlich, dass Sie überprüfen, dass die Zahl ungerade ist (nicht durch zwei teilbar), und es ist generisch, so dass Sie ($ var% 3) auf die gleiche Weise verwenden können und ableiten, wie es funktioniert für jede N.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top