[java] 이 부울 “(number & 1) == 0″은 무엇을 의미합니까?

CodeReview 에서 작업중인 코드를 게시하고이를 개선하기위한 팁을 요청했습니다. 내가 얻은 하나는 부울 메서드를 사용하여 ArrayList에 짝수 개의 인덱스가 있는지 확인하는 것이 었습니다. 제안 된 코드는 다음과 같습니다.

private static boolean isEven(int number)
{
    return (number & 1) == 0;
}

이미 많은 도움을 위해 특정 사용자를 괴롭 혔으므로 SO 커뮤니티를 괴롭힐 때라고 결정했습니다! 나는 이것이 어떻게 작동하는지 정말로 이해하지 못한다. 메서드가 호출되고 ArrayList의 크기를 매개 변수로 사용합니다 (즉, ArrayList에 10 개의 요소가 있음, 숫자 = 10).

나는 하나 &가 숫자와 1의 비교를 실행한다는 것을 알고 있지만 그 후 길을 잃었습니다.

내가 읽는 방식은 if number == 0and 1 == 0. 나는 첫 번째가 사실이 아니며 후자가 분명히 말이되지 않는다는 것을 압니다. 아무도 나를 도울 수 있습니까?

편집 : 누군가 궁금해 할 경우 코드가 작동한다고 추가해야합니다.



답변

“&”는 비트 연산입니다. 당신은 아마 이것을 알고있을 것입니다. 그러나 당신이 질문을 던진 방식에 근거하여 그것은 나에게 완전히 명확하지 않습니다.

즉, 이론적 인 아이디어는 일련의 1과 0으로 비트로 표현할 수있는 int가 있다는 것입니다. 예를 들면 :

...10110110

이진수에서는 2 진법이므로 숫자의 비트 버전이 0으로 끝날 때마다 짝수이고 1로 끝날 때 홀수입니다.

따라서 위의 경우 비트 및 1을 사용하여 수행하는 것은 다음과 같습니다.

...10110110 & ...00000001

물론 이것은 0이므로 원래 입력이 짝수라고 말할 수 있습니다.

또는 홀수를 고려하십시오. 예를 들어, 위에있는 것에 1을 더하십시오. 그때

...10110111 & ...00000001

1과 같으므로 0과 같지 않습니다. 짜잔.


답변

이진 표현에서 마지막 비트 에 의해 숫자가 짝수인지 홀수인지 확인할 수 있습니다 .

1 -> 00000000000000000000000000000001 (odd)
2 -> 00000000000000000000000000000010 (even)
3 -> 00000000000000000000000000000011 (odd)
4 -> 00000000000000000000000000000100 (even)
5 -> 00000000000000000000000000000101 (odd)
6 -> 00000000000000000000000000000110 (even)
7 -> 00000000000000000000000000000111 (odd)
8 -> 00000000000000000000000000001000 (even)

& 두 정수 사이는 비트 AND 연산자입니다.

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

경우에 따라서, (number & 1) == 0이다 true,이 방법은 number도이다.


다음을 가정 해 보겠습니다 number == 6.

6 -> 00000000000000000000000000000110 (even)

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1 -> 00000000000000000000000000000001

-------------------------------------

0 -> 00000000000000000000000000000000

그리고 언제 number == 7:

7 -> 00000000000000000000000000000111 (odd)

     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

1 -> 00000000000000000000000000000001

-------------------------------------

1 -> 00000000000000000000000000000001


답변

&비트 AND 연산자입니다. &&논리 AND 연산자입니다.

이진수에서 숫자 비트가 설정되면 (즉, 1) 숫자는 홀수입니다.

2 진수에서 숫자 비트가 0이면 숫자는 짝수입니다.

(number & 1)숫자 비트 의 비트 AND 테스트입니다.

이를 수행하는 또 다른 방법은 (효율성이 떨어지지 만 이해하기 쉬울 수 있음) 모듈러스 연산자를 사용하는 것입니다 %.

private static boolean isEven(int number)
{
    if (number < 0)
       throw new ArgumentOutOfRangeException();

    return (number % 2) == 0;
}


답변

이 표현은 “정수는 짝수를 나타냄”을 의미합니다.

이유는 다음과 같습니다 . 10 진수의 이진 표현 100000000001. 모든 홀수 1는 이진수로 끝납니다 (확인하기 쉽습니다. 숫자의 이진수 표현이로 끝나지 않는다고 가정하면 1항상 짝수 인 0이 아닌 2의 거듭 제곱으로 구성됩니다). AND홀수 로 이진수를 수행 하면 결과는 다음과 같습니다 1. AND짝수 로 이진수를 수행 하면 결과는 다음과 같습니다.0 입니다.

이것은 옵티마이 저가 부족하거나 존재하지 않았을 때 홀수 / 짝수를 결정하는 선호되는 방법이었으며 %운영자는 &운영자가 수행하는 사이클 수의 20 배가 필요했습니다 . 요즘에는을 수행 number % 2 == 0하면 컴파일러가 수행하는 것처럼 빠르게 실행되는 코드를 생성 할 가능성이 높습니다 (number & 1) == 0.


답변

단일 &은 비교가 아닌 비트 and연산자를 의미합니다.

따라서이 코드는 첫 번째 bit(가장 중요하지 않은 / 가장 오른쪽)가 설정되었는지 여부를 확인하여 숫자가 있는지 여부를 나타냅니다 odd. 모든 홀수는 1최하위 비트로 끝나기 때문입니다.xxxxxxx1


답변

&비트 AND연산입니다.

숫자 = 8 :

  1000
  0001
& ----
  0000

그 결과 (8 & 1) == 0. 이것은 2의 배수이고 오른쪽에서 첫 번째 이진수는 항상 0이기 때문에 모든 짝수에 대한 경우입니다. 1은 앞에 0이있는 이진 값 1이 있으므로 AND짝수를 사용하면 왼쪽에 있습니다. 0으로.


답변

&Java 의 연산자는 비트 및 연산자입니다. 기본적으로 (number & 1)와 사이의 비트 number1. 결과는 짝수인지 홀수인지에 따라 0 또는 1입니다. 그런 다음 결과를 0과 비교하여 짝수인지 확인합니다.

다음은 비트 연산을 설명 하는 페이지 입니다.