2009-03-15 27 views

Respuesta

12

Bitwise AND. En este caso, se verifica si el último bit en i está configurado. Si lo es, debe ser un número impar ya que el último bit representa 1 y todos los demás bits representan números pares.

2

Eso está comprobando si el último bit está activado (lo que lo hace extraño). Tenga en cuenta que no es específicamente para linq, puede hacerlo en código sql o C#.

4

'&' es el bitwise and operator. & 'con 1 elimina todos los demás dígitos binarios, dejando 0 si el número es par, 1 si es impar.

Esa es la manera de hacerlo de un hacker. ¡Un matemático escribiría ((i% 2) == 1) en su lugar, usando modulo 2 arithmetic! Mientras que un ingeniero de software escribiría! IsEven (i), reutilizando una función de biblioteca y ganando reutilización de puntos brownie ... :-)

Ahora, si alguno de estos son más eficientes depende del compilador y CLR - y en este caso, también sobre quién maneja el árbol de expresiones LINQ y con qué está preparado el destinatario.

+0

Creo que la operación & sería la más eficiente técnicamente. –

+0

No estés tan seguro. El compilador y el ejecutor IL JIT tienen mayores grados de libertad de lo que imagina ... –

+0

Un ingeniero de software que le gusta usar métodos de extensión para C# clara y concisa podría escribir i.IsNotEven(). –

4

& es un operador AND bit a bit, Y es una de las operaciones fundamentales en un sistema binario.

AND significa 'si ambos A y B están activados'. El ejemplo del mundo real es dos interruptores en serie. La corriente solo pasará si ambos permiten la corriente.

En una computadora, estos no son interruptores físicos sino semiconductores, y su funcionalidad se llama logic gates. Hacen las mismas cosas que los interruptores: reaccionan a la corriente o no a la corriente.

Cuando se aplica a enteros, cada bit de un número se combina con cada bit del otro número. Entonces, para entender el operador bit a bit AND, necesita convertir los números a binarios, luego haga la operación Y en cada par de bits coincidentes.

Esa es la razón por:

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

Considerando

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

Por consiguiente, el (& 1) operación compara el derecho más bits a 1 usando y la lógica. Todos los otros bits son ignorados efectivamente porque cualquier cosa Y nada es nada.

Esto es equivalente a verificar si el número es impar (todos los números impares tienen el bit del derecho igual a 1).

Lo anterior se ha adaptado de una respuesta similar que escribí al this question.

Cuestiones relacionadas