int f(int n) {
int c;
for (c=0;n!=0;++c)
n=n&(n-1);
return c;
}
내가 확실히이 기능을 할 의도 무엇을하는지 이해가 안되는 다음과 같은 기능을 포함하는 프로그램을 읽고있다?
int f(int n) {
int c;
for (c=0;n!=0;++c)
n=n&(n-1);
return c;
}
내가 확실히이 기능을 할 의도 무엇을하는지 이해가 안되는 다음과 같은 기능을 포함하는 프로그램을 읽고있다?
그것은 counts number of 1's은
는필자는 함수가'f' 대신에'countBinaryOnes'라고 불려지 지 않았을 때 어떻게 물어볼 필요가 없었는지를 좋아합니다. 또한, +1. – Cam
+1. 여기 2a를보십시오 - http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ – Dummy00001
코딩 우아함 : A +. 코딩의 명확성 : F. – Jay
이진수를 사용하여 n
에서 0
으로 줄이는 데 필요한 반복 횟수를 계산합니다. N의 이진 표현에
네, 그렇지만 그 반복 횟수는 다음에 의존합니다 : 블라드가 그것을 쳤습니다. –
대답은 많아야 1 : n & 0 – Amnon
@ 닉; 좋은 지적. 저는 그 설명을 생각하지 않았습니다, 그래서 저는 단지 의도보다는 기계를 기술하고있었습니다. –
프로그래밍하지 않는 방법 (x86 명령어 세트의 경우)에는 내장/인라인 어셈블러 명령어를 사용하는 것이 이와 같이 간단한 것을 더 빨리 읽고 더 읽는 것이 좋습니다. (하지만 이것은 x86 아키텍쳐에서만 마찬가지다. 나는 ARM이나 SPARC 또는 그 밖의 다른 것들에 대해 어떻게되어 있는지 모른다.)
Freescale HCS08에서 수행하는 어셈블리 명령어는 무엇입니까? : P –
나는 그걸 좀 더 정당화 할 필요가 있다고 생각한다. – BobbyShaftoe
POPCNT 명령어가 부족하다는 이유로 (현재는 사용되지 않는) 해결 방법이다. 비 군사 CPU에서.
이 함수는 n 표현의 비트 수를 반환하려고합니다. 다른 답변에서 빠진 것은 함수가 인수 n <에 대해 정의되지 않은 동작을 호출한다는 것입니다. 이것은 함수가 최하위 비트에서 최상위 비트로 시작하여 한 번에 한 비트 씩 껍질을 벗기기 때문입니다. 음수가 인 경우 이는 루프가 종료되기 전에 n의 마지막 값이 2 보수로 된 32 비트 정수의 경우 0x8000000이라는 것을 의미합니다. 이 숫자는 INT_MIN이며 이제 마지막으로 루프에 사용됩니다
이n = n&(n-1)
불행하게도, INT_MIN-1은 오버 플로우이며, 오버 플로우가 정의되지 않은 동작을 호출합니다. 일치하는 구현은 정수를 "둘러 쌀"필요가 없습니다. 예를 들어 오버플로 트랩을 대신 발행하거나 모든 종류의 이상한 결과를 남길 수 있습니다.
서명 된 수량의 세트 비트 계산은 일반적으로 원하는 결과가 아닙니다. 함수는'unsigned int'를 받아 들여야합니다. –
'f'가이 함수의 끔찍한 이름이라는 것을 알게 될 것입니다. –
댓글이나 두 사람도 다 치지 않을 것입니다. –
코드가 좋지는 않지만 30 초 후에는 다소 우아합니다. 그리고 효율적입니다. "C 프로그래머가 식별자에 더 많은 의도를 넣는 이유는 무엇입니까?"라는 좋은 예는 그렇지 않을 때 강력한 것으로 보이기에 충분히 비밀 스럽기 때문입니다. " – TheBlastOne