숫자로 비트를 계산합니다 [복제
-
20-08-2019 - |
문제
복제하다:
숫자가 있다고 가정 해 봅시다. 반복을 사용하지 않고 해당 숫자의 이진 표현에서 1에 해당하는 비트를 계산할 수있는 방법이 있습니까? 내 말은, 약간의 연산자와 마스크를 사용하여 일정한 시간에 할 수있는 방법이 있습니까? 두 아키텍처 모두 32 비트와 64 비트에 잘 작동하는 솔루션이 필요합니다. 아 거의 잊어 버렸습니다. C 언어 나 어셈블러에도 필요합니다.
해결책
루프가없는 약간 계산 알고리즘이 있습니다. http://graphics.stanford.edu/~sander/bithacks.html. 많은 비트 계산 알고리즘 http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/
다른 팁
물론, 당신은 그것을 좋아하지 않을 것입니다.
물론 모든 올바른 값이있는 조회 테이블을 만들 수 있습니다.
표 [1] = 1, 표 [2] = 1, 표 [3] = 2 등
그래서 이것은 당신에게 줄 것입니다 정말 빠릅니다 답변이지만 테이블이 매우 크고 크기 때문에 완전히 쓸모없는 해결책입니다.
이것을 조금 최적화 할 수 있지만 약간의 반복이 필요합니다. 8 비트 버전의 테이블 솔루션 인 256 개 엔트리 테이블을 만듭니다. 그런 다음 점검 할 값의 각 바이트를 반복하여 테이블 조회 결과를 요약하십시오. 같은 것 :
short int tableLookup[256] = { 0, 1, 1, 2, 1, ... };
unsigned int valueToCheck = 89392491;
int result = 0;
while ( valueToCheck != 0 ) {
result += tableLookup[ (valueToCheck & 0xFF) ];
valueToCheck >>= 8;
}
// result should now have the correct bit count, if the table is correct.
흠, 이것은 잘 알려진 것 같습니다 (그리고 여기서 나는 내 머리 꼭대기에서 이것을하고있었습니다) :http://graphics.stanford.edu/~seander/bithacks.html#countbitsnaive
예, a를 사용하여 할 수 있습니다 테이블을 찾으십시오.