2012-10-25 2 views

답변

2

숫자가 서명 된 경우 오른쪽 시프트는 부호 비트 (마지막 비트)를 복사하여 음수에 효과적으로 무한 수의 비트를 부여합니다.

int pcount_r(int x) { 
    if (x == 0) 
     return 0; 
    else if (x < 0) 
     return sizeof(int)*8 - pcount_r(~x); 
    else 
     return (x & 1) + pcount_r(x >> 1); 
} 
+0

예. 난 그냥 지금 이해 : D 조, 오직 질문 - pcount_r (~ x), ~을 의미합니다 ~ –

+0

'~'("bitwise not") 부호 비트를 포함하여 숫자의 모든 비트를 반전합니다. –

3

E1이 부호있는 유형 및 음수 (C99 6.5.7 : 5)를 가질 때 E1 >> E2이 생성하는 것은 구현에 따라 정의됩니다. 한편, E1 >> E2은 표준에 의해 명백하게 정의됩니다. 부호없는 정수를 수락하고 조작하는 것은이 함수를 가장 이식성있게 만드는 방법입니다.

덧붙여서, 비트 트위 더링에 부호없는 유형을 사용하는 것이 일반적입니다.

+0

을 더 이해할 수 있습니다. 인형으로는 –

+1

을 의미합니다. @ DanielGómezJurado'int >> shift == crap'하지만'unsigned >> shift == rulez' – hirschhornsalz

-2

문제는 C와 (Java와는 달리) 부호가있는 (산술) 이동을 지원하지 않는다는 것입니다. CPU에는 두 가지 유형의 시프트 연산자 인 signed와 unsigned가 있습니다. 예를 들어, x86에서 SAR 명령은 오른쪽으로 산술 시프트를 수행하고 SHR은 부호없는 시프트를 수행합니다. C에는 한 개의 시프트 오른쪽 연산자 (>>) 만 있으므로 둘 다 지원할 수 없습니다. 컴파일러에서 부호없는 시프트 (SHR)를 사용하여 위의 코드를 구현하고 해당 프로 시저에 음수를 제공하면 잘못된 대답을 얻게됩니다.

+0

반대로 - 만약'shr'을 사용한다면 항상 * 정확할 것입니다. 이 문제는'sar'가 사용되고 부호 비트가 설정되어 알고리즘이 종료되지 않을 때 발생합니다. – harold

+0

"C는 한 개의 시프트 오른쪽 연산자 (>>) 만 가질 수 있습니다. 두 연산자를 모두 지원할 수 없습니다."C가 단 하나의 덧셈 (+)을 가졌기 때문에 이해가 안됩니다. 따라서 정수와 부동을 모두 지원할 수 없습니다 -포인트". 실제로 ">>"를 SAR 또는 SHR로 컴파일하는 것은 컴파일러가 정수 또는 부동 소수점 계산의 의도와 동일한 규칙을 적용함으로써 컴파일러가 결정합니다. C99 6.3.1.8 : "산술 형의 피연산자가 예상되는 많은 연산자는 변환을 발생시키고 결과 형식을 비슷한 방식으로 산출합니다. 일반적인 실제 유형을 결정하는 것이 목적입니다 ... " –

+0

@harold SAR을 사용하면 프로그램이 올바르게 종료됩니다. 왜냐하면 1/2 = 0이고 SAR 때문입니다. SHL이 사용되면 프로그램도 종료되지만 부호 비트가 카운트에 1을 더하기 때.에 오답을 제공합니다. –

관련 문제