이 부울 "(number & 1) == 0"은 무엇을 의미합니까?


79

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

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

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

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

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

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


2
누가 이것을 다른 게시물에 연결했는지 아는 사람이 있습니까 (이 항목과 관련이 없음)? 어떻게 든 제거 할 수 있습니까?
Andrew Martin

1
젠장, 이건 정말 똑똑 해요!
cauon

2
이것은 트위터에 실 렸습니다.
Jonathon Reinhart 2013


1
@GrijeshChauhan 이보다 더 빠른 방법에 대해 자세히 설명해 주시겠습니까 number % 2 == 0?
Vrushank 2013

답변:


114

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

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

...10110110

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

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

...10110110 & ...00000001

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

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

...10110111 & ...00000001

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


13
감사합니다-귀하의 설명은 매우 명확합니다. 게다가 Voila로 끝나는 모든 답변은 찬성 할 가치가 있습니다.
Andrew Martin

1
이 답변에서 음수도 알고 있어야합니다.
Alvin Wong

3
또한 저는이 답변을 수정 n%k == n&(k-1)하여 모두 k에게 긍정적 인 2 의 힘인 사실을 포함 할 것입니다. 질문자가 요청한 것이 아닐 수도 있지만 알아두면 편리한 것입니다.
fluffy

1
@fluffy는 작동하지 않을 것이라고 말하지 않았지만 모든 사람이 2의 보완을 아는 것은 아닙니다.
Alvin Wong

1
@fluffy는 그 표현에 log또는 2^어딘가에 있어야하지 않습니까?
Navin 2013

67

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

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

18

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

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

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

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

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

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

    return (number % 2) == 0;
}

2
&또한 논리적 AND입니다. 하지 않는 &&동안 단락 &.
Steve Kuo 2013

5
number % 2동일한없는 number & 1경우에 number제외된다.
dan04

4
음수 길이를 통과하면 더 큰 문제가 있습니다! ;)
Mitch Wheat

4
@RyanAmos "각 비트 반복?" 비트 AND는 내가 본 모든 CPU에서 단일 작업입니다. 병렬로 수행하는 가장 쉬운 작업 중 하나입니다.
푹신한

2
@MitchWheat number < 0케이스 를 던질 이유가 없습니다 . 홀수 음수 모드 2는 -1이지만 짝수 모드 2는 여전히 0입니다.
fluffy

8

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

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

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


5

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

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


다음 과 같은 식의 부작용을 유지하려는 경우 단일 &을 논리적으로 사용할 수 있습니다andf(x) & g(x)
Navin

4

&비트 AND연산입니다.

숫자 = 8 :

  1000
  0001
& ----
  0000

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


3

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

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


3

바이너리를 수행하고 1에 대해 최하위 비트가 설정되지 않은 경우 0을 반환합니다.

당신의 예를 들어

00001010 (10)

00000001 (1)

===========

00000000 (0)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.