2012-08-29 1 views
3

조회 테이블을 사용하지 않고 UInt32에서 설정 비트 수를 계산하는 가장 빠른 방법은 무엇입니까? 즉, 1의 수를 계산하는 가장 빠른 방법은 무엇입니까? O (1)에서 셀 수있는 방법이 있습니까?C#에서 UInt32의 설정 비트를 계산하는 가장 빠른 방법은 무엇입니까

+0

봐 http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set- 비트 - 인 - 32 비트 정수). – Batuu

답변

5

bit-twiddling hacks 페이지에는 다양한 옵션이 있습니다. 32 개 개의 모든 가능한 비트를 반복하는 것은 O (N)가이 같은 비용 매번 편의상 :

있다는 것을 물론

, 당신은, 내가 생각 하는데요 주장 할 수 룩업 테이블-행된 바이트 방식, 또는 나뿐만 써서 설정 비트가있는만큼, 반복 처리 브라이언 커니 핸의 깔끔한 아이디어 :

public static int CountBits(uint value) 
{ 
    int count = 0; 
    while (value != 0) 
    { 
     count++; 
     value &= value - 1; 
    } 
    return count; 
} 

당신이 256 항목의 조회 테이블을 채우기의 아이디어를 좋아하지 않는 경우를, nybble 조회는 여전히 꽤 빠를 것입니다. 8 개의 배열 조회가 32 간단한 비트 연산보다 느릴 수도 있습니다.

물론 난해한 접근법을 사용하기 전에 앱의 실제 성능을 테스트 해 볼 가치가 있습니다. 이것이 정말로 병목 현상입니까?

+0

이것은 더 읽기 쉬워 보이지만, 나는 아직도 이런 식으로 계산 비트를 어떻게 사용하는지 궁금해합니다. 추측을해야만한다면 아마도 암호화에 사용될 것입니다. – Alisson