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

Author: Pshemo, 2013-02-16

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.

 114
Author: Kirby,
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
 68
Author: Eng.Fouad,
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;
}
 18
Author: Mitch Wheat,
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.

 8
Author: Sergey Kalinichenko,
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

 5
Author: iTech,
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.

 4
Author: Aram Kocharyan,
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.

Oto strona opisująca operacje bitowe .

 3
Author: rgettman,
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)

 3
Author: Peter Karlsson,
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

 3
Author: Naveen AH,
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