2010-07-16 8 views
18

나는이 기능의 기능은 무엇입니까?

int f(int n) { 
    int c; 
    for (c=0;n!=0;++c) 
     n=n&(n-1); 
    return c; 
} 

내가 확실히이 기능을 할 의도 무엇을하는지 이해가 안되는 다음과 같은 기능을 포함하는 프로그램을 읽고있다?

+44

'f'가이 함수의 끔찍한 이름이라는 것을 알게 될 것입니다. –

+1

댓글이나 두 사람도 다 치지 않을 것입니다. –

+3

코드가 좋지는 않지만 30 초 후에는 다소 우아합니다. 그리고 효율적입니다. "C 프로그래머가 식별자에 더 많은 의도를 넣는 이유는 무엇입니까?"라는 좋은 예는 그렇지 않을 때 강력한 것으로 보이기에 충분히 비밀 스럽기 때문입니다. " – TheBlastOne

답변

33

그것은 counts number of 1's

+7

필자는 함수가'f' 대신에'countBinaryOnes'라고 불려지 지 않았을 때 어떻게 물어볼 필요가 없었는지를 좋아합니다. 또한, +1. – Cam

+0

+1. 여기 2a를보십시오 - http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ – Dummy00001

+1

코딩 우아함 : A +. 코딩의 명확성 : F. – Jay

3

이진수를 사용하여 n에서 0으로 줄이는 데 필요한 반복 횟수를 계산합니다. N의 이진 표현에

+0

네, 그렇지만 그 반복 횟수는 다음에 의존합니다 : 블라드가 그것을 쳤습니다. –

+0

대답은 많아야 1 : n & 0 – Amnon

+3

@ 닉; 좋은 지적. 저는 그 설명을 생각하지 않았습니다, 그래서 저는 단지 의도보다는 기계를 기술하고있었습니다. –

0

이 될 수는 n이 유효 비트 수를 반환하려고? (완전히 생각하지 못했습니다 ...)

+0

나는 블라디미르의 대답이 기술적으로 정확하다고 생각하지만, 나는이 설명이 가장 마음에 든다. – Randolpho

+2

@ 랜돌 포 무엇? 이 대답은 잘못되었습니다. 입력 0b1000이 주어지면 4가 아니라 1을 반환합니다. (중요한 이진수 - 비트의 수) –

+0

중요한 비트는 무엇을 의미합니까? – Amnon

10

설명의 중요성을 보여줍니다.

+14

아니요, 분명히 아닙니다. 함수 이름이 얼마나 중요한지 보여주기위한 것입니다. –

+2

설명적인 함수 이름은 주석으로 간주 될 수 있습니다. – JeremyP

+3

@JeremyP : 아니요. – Cam

0

프로그래밍하지 않는 방법 (x86 명령어 세트의 경우)에는 내장/인라인 어셈블러 명령어를 사용하는 것이 이와 같이 간단한 것을 더 빨리 읽고 더 읽는 것이 좋습니다. (하지만 이것은 x86 아키텍쳐에서만 마찬가지다. 나는 ARM이나 SPARC 또는 그 밖의 다른 것들에 대해 어떻게되어 있는지 모른다.)

+1

Freescale HCS08에서 수행하는 어셈블리 명령어는 무엇입니까? : P –

+0

나는 그걸 좀 더 정당화 할 필요가 있다고 생각한다. – BobbyShaftoe

4

POPCNT 명령어가 부족하다는 이유로 (현재는 사용되지 않는) 해결 방법이다. 비 군사 CPU에서.

5

이 함수는 n 표현의 비트 수를 반환하려고합니다. 다른 답변에서 빠진 것은 함수가 인수 n <에 대해 정의되지 않은 동작을 호출한다는 것입니다. 이것은 함수가 최하위 비트에서 최상위 비트로 시작하여 한 번에 한 비트 씩 껍질을 벗기기 때문입니다. 음수가 인 경우 이는 루프가 종료되기 전에 n의 마지막 값이 2 보수로 된 32 비트 정수의 경우 0x8000000이라는 것을 의미합니다. 이 숫자는 INT_MIN이며 이제 마지막으로 루프에 사용됩니다

n = n&(n-1) 

불행하게도, INT_MIN-1은 오버 플로우이며, 오버 플로우가 정의되지 않은 동작을 호출합니다. 일치하는 구현은 정수를 "둘러 쌀"필요가 없습니다. 예를 들어 오버플로 트랩을 대신 발행하거나 모든 종류의 이상한 결과를 남길 수 있습니다.

+1

서명 된 수량의 세트 비트 계산은 일반적으로 원하는 결과가 아닙니다. 함수는'unsigned int'를 받아 들여야합니다. –

관련 문제