Nel codice seguente:Qual è il significato dell'operatore &?
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
... qual è il significato di (i & 1) == 1
?
Nel codice seguente:Qual è il significato dell'operatore &?
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
... qual è il significato di (i & 1) == 1
?
Bitwise AND. In questo caso, controllare se è impostato l'ultimo bit in i
. Se lo è, deve essere un numero dispari poiché l'ultimo bit rappresenta 1 e tutti gli altri bit rappresentano numeri pari.
Questo sta controllando se l'ultimo bit è attivo (il che lo rende strano). Nota che non è specifico per linq, puoi farlo sul codice sql o C#.
'&' è il bitwise and operator. & 'con 1 elimina tutte le altre cifre binarie, lasciando 0 se il numero è pari, 1 se è dispari.
Questo è il modo di farlo da un hacker. Un matematico ovviamente scriverebbe ((i% 2) == 1) invece, usando modulo 2 arithmetic! Mentre un ingegnere del software scriveva! IsEven (i), riutilizzando una funzione di libreria e riutilizzando i punti brownie ... :-)
Ora, se uno di questi è più efficiente dipende dal compilatore e dal CLR - e in in questo caso, anche su chi riesce a gestire l'albero delle espressioni LINQ e su cosa è pronto a gestire il destinatario.
& è un operatore AND bit a bit, ed è una delle operazioni fondamentali in un sistema binario.
AND significa "se entrambi A e B sono attivi". L'esempio del mondo reale è costituito da due interruttori in serie. La corrente passerà solo se entrambi consentono il passaggio di corrente.
In un computer, questi non sono interruttori fisici ma semiconduttori e la loro funzionalità è denominata logic gates. Fanno lo stesso tipo di cose come gli interruttori - reagiscono alla corrente o alla mancanza di corrente.
Se applicato a numeri interi, ogni bit in un numero viene combinato con ogni bit nell'altro numero. Quindi, per capire l'operatore bit a bit AND, è necessario convertire i numeri in binario, quindi eseguire l'operazione AND su ogni coppia di bit corrispondenti.
Ecco perché:
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
Mentre
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
L'(& 1) il funzionamento confronta dunque il più a destra bit a 1 con logica AND. Tutti gli altri bit vengono effettivamente ignorati perché nulla E niente è nulla.
Questo equivale a controllare se il numero è un numero dispari (tutti i numeri dispari hanno il bit più a destra uguale a 1).
Quanto sopra è stato adattato da una risposta simile che ho scritto a this question.
Credo che l'operazione & sarebbe la più efficiente dal punto di vista tecnico. –
Non essere troppo sicuro. Il compilatore e l'esecutore di IL JIT ha un grado di libertà maggiore di quello che si potrebbe immaginare ... –
Un ingegnere del software a cui piaccia usare i metodi di estensione per C# chiaro e terso potrebbe scrivere i.IsNotEven(). –