Co oznacza ta wartość logiczna "(liczba & 1) = = 0"?
Na CodeReview opublikowałem roboczy fragment kodu i poprosiłem o wskazówki, aby go poprawić. Jeden dostałem było użycie metody boolean, aby sprawdzić, czy ArrayList miał parzystą liczbę indeksów (co było wymagane). To był kod, który został zasugerowany:
private static boolean isEven(int number)
{
return (number & 1) == 0;
}
Ponieważ już nękałem tego konkretnego użytkownika za dużo pomocy, zdecydowałem, że nadszedł czas, abym nękał społeczność SO! Nie rozumiem, jak to działa. Metoda jest wywoływana i przyjmuje wielkość ArrayList jako parametr (tzn. ArrayList ma dziesięć elementów, liczba = 10).
Wiem, że pojedynczy &
porównuje zarówno liczbę, jak i 1, ale potem się pogubiłem.
Sposób, w jaki to czytam, mówi return true if number == 0
i 1 == 0
. Wiem, że pierwszy nie jest prawdziwy, a drugi najwyraźniej nie ma sensu. Czy ktoś może mi pomóc?
Edit: powinienem chyba dodać, że kod działa, na wypadek gdyby ktoś się zastanawiał.
9 answers
Należy pamiętać, że " & " jest operacją bitową. Prawdopodobnie jesteś tego świadom, ale nie jest to dla mnie do końca jasne w oparciu o sposób, w jaki postawiłeś pytanie.
To powiedziawszy, teoretyczna idea jest taka, że masz pewną int, która może być wyrażona w bitach przez niektóre serie 1s i 0s. na przykład:
...10110110
W binarnym, ponieważ jest bazą 2, gdy bitowa wersja liczby kończy się na 0, jest parzysta, a gdy kończy się na 1, jest nieparzysta.
Dlatego, robiąc bitowe & z 1 dla powyższego to:
...10110110 & ...00000001
Oczywiście jest to 0, więc można powiedzieć, że oryginalne wejście było parzyste.
Alternatywnie, rozważmy liczbę nieparzystą. Na przykład dodaj 1 do tego, co mieliśmy powyżej. Then
...10110111 & ...00000001
Jest równa 1, a zatem nie jest równa zero. Voila.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 00:49:16
Możesz określić liczbę parzystą lub nieparzystą przez ostatni bit w jego reprezentacji binarnej:
1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)
&
pomiędzy dwiema liczbami całkowitymi jest bitowy i operator:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Jeśli więc (number & 1) == 0
jest true
, oznacza to number
jest parzyste.
Załóżmy, że number == 6
, wtedy:
6 -> 00000000000000000000000000000110 (even)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
0 -> 00000000000000000000000000000000
I kiedy number == 7
:
7 -> 00000000000000000000000000000111 (odd)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1 -> 00000000000000000000000000000001
-------------------------------------
1 -> 00000000000000000000000000000001
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 01:08:50
&
jest operatorem bitowym i. &&
jest operatorem logicznym i
W binarnym, jeśli bit cyfr jest ustawiony (tj. jeden), liczba jest nieparzysta.
W binarnym, jeśli bit cyfr jest równy zeru, liczba jest parzysta.
(number & 1)
jest bitowym i testem bitu cyfr.
Innym sposobem na to (i być może mniej efektywnym, ale bardziej zrozumiałym) jest użycie operatora modułu %
:
private static boolean isEven(int number)
{
if (number < 0)
throw new ArgumentOutOfRangeException();
return (number % 2) == 0;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 02:13:18
To wyrażenie oznacza "liczba całkowita reprezentuje liczbę parzystą".
Oto powód, dla którego: binarna reprezentacja dziesiętna 1
to 00000000001
. Wszystkie liczby nieparzyste kończą się 1
w binarnym (jest to łatwe do zweryfikowania: Załóżmy, że reprezentacja binarna liczby nie kończy się na 1
; wtedy składa się z niezerowych potęg dwóch, które zawsze są liczbą parzystą). Gdy wykonujesz binarne AND
z liczbą nieparzystą, wynikiem jest 1
; gdy wykonujesz binarne AND
z liczbą parzystą, wynikiem is 0
.
Była to preferowana metoda decydowania nieparzystego / parzystego w czasie, gdy optymalizatory były słabe do nieistniejących, a operatory %
wymagały dwadzieścia razy więcej cykli wykonanych przez operatora &
. W dzisiejszych czasach, jeśli robisz number % 2 == 0
, kompilator prawdopodobnie wygeneruje kod, który wykonuje tak szybko, jak robi to (number & 1) == 0
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-20 03:13:27
Pojedynczy &
oznacza bitowy operator and
nie porównanie
Więc ten kod sprawdza, czy pierwszy bit
(najmniej znaczący/najbardziej prawy) jest ustawiony czy nie, co wskazuje, czy liczba jest odd
czy nie; ponieważ wszystkie liczby nieparzyste zakończą się 1
w najmniej znaczącym bitie, np. xxxxxxx1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 00:51:31
&
jest operacją bitową AND
.
Dla liczby = 8:
1000
0001
& ----
0000
Wynik jest taki, że (8 & 1) == 0
. Tak jest w przypadku wszystkich liczb parzystych, ponieważ są wielokrotnościami 2, a pierwsza cyfra binarna z prawej strony to zawsze 0. 1 ma wartość binarną 1 z wiodącymi 0s, więc gdy {[2] } to z liczbą parzystą pozostajemy z 0.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 00:53:51
Operator &
w Javie jest operatorem bitowym-and. Zasadniczo, (number & 1)
wykonuje bitowe-i pomiędzy number
i 1
. Wynik wynosi 0 LUB 1, w zależności od tego, czy jest parzysty, czy nieparzysty. Następnie wynik jest porównywany z 0, aby określić, czy jest parzyste.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 00:45:53
Wykonuje binarną i przeciw 1, która zwraca 0, jeśli najmniej znaczący bit nie jest ustawiony
Dla Twojego przykładu
00001010 (10)
00000001 (1)
===========
00000000 (0)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 00:54:48
Jest to logiczna koncepcja projektu bitowo & (AND)operater.
Return (2 & 1 ); oznacza-Przelicz wartość na liczby bitowe i wykonaj funkcję (AND) i zwróć wartość.
Preferuj ten link http://www.roseindia.net/java/master-java/java-bitwise-and.shtml
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 07:41:50