2011-03-04 2 views
3

이 문제를 해결하고 논리를 설명하는 데 도움을주십시오. 여기에 & 연산자가 어떻게 작동하는지 모르겠습니다.비트 AND 연산자는 무엇을할까요?

void main() { 
    int a = -1; 
    static int count; 
    while (a) { 
     count++; 
     a &= a - 1; 
    } 
    printf("%d", count); 
} 
+3

카운트는 방법에 의해 초기화되어야합니다. – Andrew

+1

무엇이 문제입니까? 당신이 기대하는 대답은 무엇입니까? – MAK

+1

다음과 같이 많이 보입니다. http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer/109036#109036 – sarnold

답변

5

당신이

a&=a-1; 

를 참조하는 경우 다음은 이후에 복사 된 비트 및 운전가의와-1입니다.

편집 : 주석에 타데 우시 A. Kadłubowski에서 복사로 :

a = a & (a-1); 
+2

꽤 많이 'a = a & (a-1);와 같다.' –

+0

@Tadeusz가 복사하여 귀속되고 upvoted your comment, thnx –

+0

일지도 모른다. 중요한 것은 'a'의 값에 대해이 표현식이 동일하지 않을 수 있다는 점입니다. 다른 변수'b'에 대해'#define a (++ b)'를 고려하십시오. OP가 C.의 복잡한 것을 배우는 CS 학생 인 경우의 사소한 설명. –

2

&bitwise and operator입니다.

와 동일 동작

a&=a-1; 

:

a = a & a-1; 

a의 최하위 비트를 클리어한다.

따라서 프로그램은 효과적으로 a에 설정된 비트 수를 계산합니다.

countstatic으로 선언되므로 자동으로 0으로 초기화됩니다.

0

당신이라고

static int count=0; 

운영자 & 및 aa&=a-1;는 최하위 비트를 클리어 http://en.wikipedia.org/wiki/Bitwise_operation#AND

+0

올바르지 않습니다. – codaddict

+0

C 표준은 프로그래머가 명시 적으로 초기화하지 않은 경우 정적 변수가 0으로 초기화되도록 보장합니다. 그럼에도 불구하고 프로그램은 명시 적으로 초기화하거나 사용하기 전에 값을 할당하는 것이 좋습니다. – Lundin

+0

나는 C 스펙을 살펴본 후에 위와 같이 당신을 모순되게 만들었고 나의 실수를 깨달았다. 다른 사람이 우연히 발견되면 관련 부분은 6.7.8.10입니다. –

3

식 (오른쪽 1)해야한다

을 초기화되지 않은 카운트있다. 이 코드는 a (이 경우 -1)의 비트 수를 계산합니다.

32 비트 정수 구성에

a = -1 ; // 11111111 11111111 11111111 11111111 32bits signed integer 

코드 출력 32로부터 출발.