2009-03-15 20 views

risposta

12

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.

2

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#.

4

'&' è 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.

+0

Credo che l'operazione & sarebbe la più efficiente dal punto di vista tecnico. –

+0

Non essere troppo sicuro. Il compilatore e l'esecutore di IL JIT ha un grado di libertà maggiore di quello che si potrebbe immaginare ... –

+0

Un ingegnere del software a cui piaccia usare i metodi di estensione per C# chiaro e terso potrebbe scrivere i.IsNotEven(). –

4

& è 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.