int pcount_r (unsigned x) {
if(x==0)
return 0;
else
return ((x & 1) + pcount_r(x >> 1));
}
입력 인수가 서명되지 않은 이유가 궁금합니다.인구수에 대한 입력 인수가 부호가없는 이유
최고!
int pcount_r (unsigned x) {
if(x==0)
return 0;
else
return ((x & 1) + pcount_r(x >> 1));
}
입력 인수가 서명되지 않은 이유가 궁금합니다.인구수에 대한 입력 인수가 부호가없는 이유
최고!
숫자가 서명 된 경우 오른쪽 시프트는 부호 비트 (마지막 비트)를 복사하여 음수에 효과적으로 무한 수의 비트를 부여합니다.
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);
}
예. 난 그냥 지금 이해 : D 조, 오직 질문 - pcount_r (~ x), ~을 의미합니다 ~ –
'~'("bitwise not") 부호 비트를 포함하여 숫자의 모든 비트를 반전합니다. –
E1이 부호있는 유형 및 음수 (C99 6.5.7 : 5)를 가질 때 E1 >> E2
이 생성하는 것은 구현에 따라 정의됩니다. 한편, E1 >> E2
은 표준에 의해 명백하게 정의됩니다. 부호없는 정수를 수락하고 조작하는 것은이 함수를 가장 이식성있게 만드는 방법입니다.
덧붙여서, 비트 트위 더링에 부호없는 유형을 사용하는 것이 일반적입니다.
을 더 이해할 수 있습니다. 인형으로는 –
을 의미합니다. @ DanielGómezJurado'int >> shift == crap'하지만'unsigned >> shift == rulez' – hirschhornsalz
문제는 C와 (Java와는 달리) 부호가있는 (산술) 이동을 지원하지 않는다는 것입니다. CPU에는 두 가지 유형의 시프트 연산자 인 signed와 unsigned가 있습니다. 예를 들어, x86에서 SAR 명령은 오른쪽으로 산술 시프트를 수행하고 SHR은 부호없는 시프트를 수행합니다. C에는 한 개의 시프트 오른쪽 연산자 (>>) 만 있으므로 둘 다 지원할 수 없습니다. 컴파일러에서 부호없는 시프트 (SHR)를 사용하여 위의 코드를 구현하고 해당 프로 시저에 음수를 제공하면 잘못된 대답을 얻게됩니다.
반대로 - 만약'shr'을 사용한다면 항상 * 정확할 것입니다. 이 문제는'sar'가 사용되고 부호 비트가 설정되어 알고리즘이 종료되지 않을 때 발생합니다. – harold
"C는 한 개의 시프트 오른쪽 연산자 (>>) 만 가질 수 있습니다. 두 연산자를 모두 지원할 수 없습니다."C가 단 하나의 덧셈 (+)을 가졌기 때문에 이해가 안됩니다. 따라서 정수와 부동을 모두 지원할 수 없습니다 -포인트". 실제로 ">>"를 SAR 또는 SHR로 컴파일하는 것은 컴파일러가 정수 또는 부동 소수점 계산의 의도와 동일한 규칙을 적용함으로써 컴파일러가 결정합니다. C99 6.3.1.8 : "산술 형의 피연산자가 예상되는 많은 연산자는 변환을 발생시키고 결과 형식을 비슷한 방식으로 산출합니다. 일반적인 실제 유형을 결정하는 것이 목적입니다 ... " –
@harold SAR을 사용하면 프로그램이 올바르게 종료됩니다. 왜냐하면 1/2 = 0이고 SAR 때문입니다. SHL이 사용되면 프로그램도 종료되지만 부호 비트가 카운트에 1을 더하기 때.에 오답을 제공합니다. –
오른쪽 시프트 및 부호 비트! da da – SparKot
은 –