Domanda

Uso spesso ($ var & amp; 1) nel mio codice, che restituisce vero se $ var è un numero dispari e falso se è un numero pari.

Ma cosa significa " & amp; " davvero?

È stato utile?

Soluzione

& amp; è e binari. Se hai un valore binario e e con un altro valore binario, il risultato sarà il e bit a bit dei due. Un esempio:

  01101010
& 01011001
= 01001000

Il bit più a destra è un 1 (e in quel caso il numero è un numero dispari) oppure è uno 0, nel qual caso il numero è pari. Se & amp; un numero con 1, guardi solo il bit meno significativo e if verifica se il numero è un 1 o uno 0. Come altri hanno già detto, guarda gli operatori bit a bit per informazioni su come funzionano.

Altri suggerimenti

Due operazioni fondamentali per i sistemi binari sono OR e AND.

O significa "se A è acceso o B è acceso". Un esempio del mondo reale sarebbero due interruttori in parallelo. Se uno dei due consente la corrente, allora la corrente passa.

AND significa "se entrambi A e B sono attivi". L'esempio del mondo reale sono due interruttori in serie. La corrente passerà solo se entrambi consentono la corrente.

In un computer, questi non sono switch fisici ma semiconduttori e le loro funzionalità sono chiamate porte logiche . Fanno le stesse cose degli interruttori: reagiscono alla corrente o nessuna corrente.

Se applicato a numeri interi, ogni bit in un numero viene combinato con ogni bit nell'altro numero. Quindi, per comprendere gli operatori bit a bit OR e AND, è necessario convertire i numeri in binario, quindi eseguire l'operazione OR o AND su ogni coppia di bit corrispondenti.

Ecco perché:

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

considerando che

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

L'operazione (& amp; 1) confronta quindi il bit più a destra con 1 usando la logica AND. Tutti gli altri bit vengono effettivamente ignorati perché nulla E nulla è niente. Un numero pari in binario è anche un numero pari in notazione decimale (10 è un multiplo di 2).

Altre operazioni fondamentali ai sistemi binari includono NOT e XOR. NOT significa "se A è spento" ed è l'unica forma di gate logico che accetta solo un segnale o "parametro" anziché due. XOR significa "se A o B sono attivi, ma non entrambi". E poi ci sono NAND, NOR e NXOR, che fondamentalmente NON sono combinati con AND, OR e XOR, cioè NAND significa "se A e B sono non entrambi attivi".

Nella programmazione, l'operatore

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

Gli altri possono essere inventati combinandoli, ad esempio:

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

Nota specifica su PHP

Gli operatori bit a bit non funzionano su valori in virgola mobile e in PHP i valori float verranno prima convertiti implicitamente in numeri interi. I numeri al di fuori dell'intervallo che possono essere espressi come numeri interi verranno troncati a zero, ovvero tutti i numeri su PHP_INT_MAX appariranno "pari". nell'espressione ($ num & amp; 1) ). Se vuoi supportare numeri al di fuori di PHP_INT_MIN / PHP_INT_MAX, avrai bisogno di fmod ($ num, 2) . Se, tuttavia, utilizzi PHP a 64 bit, i tuoi numeri interi avranno comunque una precisione maggiore rispetto ai float.

Questo è anche interessante da sapere su bitwise e 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

Oltre alle altre risposte, vale la pena notare che

if(func1() && func2())

Chiamerà func2 () se func1 () restituisce true (" valutazione pigra "), mentre

if(func1() & func2())

Chiamerà entrambe le funzioni indipendentemente, ma le tabelle di verità per entrambe saranno le stesse (supponendo che restituiscano valori booleani).


thomasrutter sottolinea (nei commenti sotto) che probabilmente non dovresti fare quest'ultimo in pratica. (A & amp; B) non necessariamente avrà la stessa veridicità di (A & amp; & amp; B) , in particolare quando A e < codice> B sono numeri interi. ad es. se A = 1 e B = 2 (entrambi sinceri), A & amp; B sarà falso, mentre A & amp; & amp; B è veritiera. Inoltre, un altro sviluppatore potrebbe pensare che questo sia un refuso e "correggerlo" a due e commerciali.

So che la tua domanda riguarda la comprensione dell'operatore bit per bit e la risposta accettata lo spiega bene. Ma per l'esempio che dai, non posso fare a meno di consigliarti di utilizzare invece l'operatore modulo:

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

Perché chiarisce l'intenzione che stai verificando che il numero sia dispari (non divisibile per due), ed è più generico, quindi puoi usare ($ var% 3) allo stesso modo e dedurre come funziona per qualsiasi N.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top