W poniższym kodzie:Jakie jest znaczenie operatora &?
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
... jaki jest sens (i & 1) == 1
?
W poniższym kodzie:Jakie jest znaczenie operatora &?
Expression<Func<int, bool>> isOdd = i => (i & 1) == 1;
... jaki jest sens (i & 1) == 1
?
Bitwise AND. W takim przypadku sprawdź, czy ustawiono ostatni bit w i
. Jeśli tak, to musi to być liczba nieparzysta, ponieważ ostatni bit reprezentuje 1, a wszystkie inne bity oznaczają liczby parzyste.
Oznacza to, czy ostatni bit jest włączony (co czyni go nieparzystym). Zauważ, że nie jest to specjalnie linq, możesz to zrobić na sql lub C# code.
"&" to bitwise and operator. & 'ing with 1 eliminuje wszystkie inne cyfry binarne, pozostawiając 0, jeśli liczba jest parzysta, 1 jeśli jest nieparzysta.
To jest sposób na zrobienie tego hakerowi. Matematyk mógłby oczywiście napisać ((i% 2) == 1) zamiast, używając modulo 2 arithmetic! Podczas gdy inżynier oprogramowania napisałby! IsEven (i), ponowne użycie funkcji bibliotecznej i ponowne wykorzystanie punktów ciastek ... :-)
Teraz, czy którykolwiek z nich jest bardziej wydajny, zależy od kompilatora i CLR - i w tym przypadku, także na temat tego, kto ma do czynienia z drzewem wyrażeń LINQ i z czym ten odbiorca jest przygotowany.
& to bitowy operator AND, który jest jedną z podstawowych operacji w systemie binarnym.
AND oznacza "jeśli A i B są włączone". Przykładem świata rzeczywistego są dwa przełączniki w szeregu. Prąd przepłynie tylko wtedy, gdy obydwa dopuszczą prąd.
W komputerze nie są to fizyczne przełączniki, ale półprzewodniki, a ich funkcjonalność nazywa się logic gates. Robią to samo, co przełączniki - reagują na prąd lub brak prądu.
Po zastosowaniu do liczb całkowitych każdy bit w jednej liczbie jest łączony z każdym bitem w innym numerze. Aby zrozumieć operator bitowy ORAZ, musisz przekonwertować liczby na binarne, a następnie wykonać operację AND na każdej parze pasujących bitów.
Dlatego:
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
Zważywszy
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
The (& 1) działanie porównuje się zatem do najbardziej po prawej bitu na 1 przy użyciu i logiki. Wszystkie inne bity są skutecznie ignorowane, ponieważ wszystko I nic nie jest niczym.
Jest to równoważne sprawdzeniu, czy liczba jest liczbą nieparzystą (wszystkie liczby nieparzyste mają wartość najbardziej zbliżoną do 1).
Powyższe zostało dostosowane z podobnej odpowiedzi, którą napisałem do this question.
Uważam, że & operacja byłaby najbardziej wydajna pod względem technicznym. –
Nie bądź zbyt pewny. Kompilator i wykonawca IL JIT ma większy stopień swobody, niż można sobie wyobrazić ... –
Inżynier oprogramowania, który lubił używać metod rozszerzających do jasnego i zwięzłego C#, mógł napisać i.IsNotEven(). –