2009-03-15 16 views

Antwort

12

Bitwise AND. Überprüfen Sie in diesem Fall, ob das letzte Bit in i gesetzt ist. Wenn dies der Fall ist, muss es eine ungerade Zahl sein, da das letzte Bit 1 darstellt und alle anderen Bits gerade Zahlen darstellen.

2

Das überprüft, ob das letzte Bit eingeschaltet ist (was es ungerade macht). Beachten Sie, dass Linq nicht speziell auf sql- oder C# -Code angewendet werden kann.

4

'&' ist die bitwise and operator. & 'ing mit 1 eliminiert alle anderen Binärziffern, wobei 0 übrigbleibt, wenn die Zahl gerade ist, 1, wenn es ungerade ist.

Das ist der Weg eines Hackers. Ein Mathematiker würde natürlich schreiben ((i% 2) == 1) statt modulo 2 arithmetic! Während ein Software - Ingenieur schreiben würde! IsEven (i), eine Bibliotheksfunktion wiederverwenden und wiederverwendung brownie Punkte zu verdienen ... :-)

Nun, ob einer dieser effizienter ist, hängt vom Compiler und CLR - und in In diesem Fall auch, wer mit dem LINQ-Ausdrucksbaum umgehen soll und wozu dieser Empfänger bereit ist.

+0

Ich glaube, dass der & Betrieb technisch am effizientesten wäre. –

+0

Sei dir nicht zu sicher. Der Compiler und der IL JIT-Executor haben größere Freiheitsgrade, als Sie sich vorstellen können ... –

+0

Ein Software-Ingenieur, der gerne Extension-Methoden für klares und kurzes C# verwendet, könnte i.IsNotEven() schreiben. –

4

& ist ein bitweiser AND-Operator, UND ist eine der grundlegenden Operationen in einem binären System.

AND bedeutet "wenn sowohl A als auch B eingeschaltet ist". Das reale Beispiel sind zwei Schalter in Serie. Strom wird nur dann durchgelassen, wenn beide Strom durchlassen.

In einem Computer sind dies keine physischen Schalter, sondern Halbleiter, und ihre Funktionalität wird logic gates genannt. Sie machen die gleichen Dinge wie die Schalter - reagieren auf Strom oder keinen Strom.

Bei Ganzzahlen wird jedes Bit in einer Zahl mit jedem Bit in der anderen Zahl kombiniert. Um den bitweisen Operator AND zu verstehen, müssen Sie die Zahlen in Binärwerte umwandeln und dann die AND-Operation für jedes Paar übereinstimmender Bits durchführen.

Deshalb:

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

Während

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

Der (& 1) Betrieb somit die am weitesten rechts stehende Bit auf 1 vergleicht und Logik. Alle anderen Bits werden effektiv ignoriert, weil alles AND nichts nichts ist.

Dies entspricht der Überprüfung, ob die Zahl eine ungerade Zahl ist (alle ungeraden Zahlen haben ein rechtestes Bit gleich 1).

Das obige ist von einer ähnlichen Antwort angepasst, die ich an this question schrieb.