첫번째 라인 16 2 비트 정수 배열, 표현의 결과로서 정수 처리 0 2 비트 쌍 0 비트가 설정 되었다면 2 비트 쌍의 1 비트가 설정된 경우 (1 빈 또는 10 빈), 2 비트 쌍의 두 비트가 모두 설정된 경우 2입니다. 이는 두 개의 비트 중 낮은 쪽이 x
이고 두 비트 중 낮은 쪽이 x
이라고 생각하기 때문입니다. 그들을 함께 추가하십시오. 당사의 summands는 0 또는 1로 제한되기 때문에 2 비트 쌍 외부에서 carry가 발생하지 않습니다. 결과는 x
에 다시 저장됩니다.
x = (x & (0x55555555)) + ((x >> 1) & (0x55555555));
다음 라인은 모든 4 비트를 차지하는데 사용되는 두 피가수에 그 합을 기억 똑같은 별도 정수마다 2 비트들을 처리 시간이, 않는다. 이 연산 후에 정수는 근본적으로 8 개의 4 비트 정수로 이루어진 배열이됩니다. 연산 전에 각 summand는 마지막 행의 계수에 해당하므로 0, 1 또는 2 (10 진수)입니다. 이 때문에 우리는 각 합계가 4보다 크지 않다는 것을 안다. 각 4 비트 int는 최대 값 15 (10 진수)를 가지므로 오버플로가 발생하지 않는다는 것을 알고있다. 위와 같이 결과는 x
에 다시 저장됩니다.
x = (x & (0x33333333)) + ((x >> 2) & (0x33333333));
우리는 전술 한 바와 같이 8 비트의 각 세트에 4 비트의 모든 쌍을 suming 이번에 똑같이.
x = (x & (0x0f0f0f0f)) + ((x >> 4) & (0x0f0f0f0f));
우리는 그 다음 16 비트 (x
의 상부 및 하부 절반)의 각 쌍의 8 비트들의 어느 쌍 합계.
x = (x & (0x00ff00ff)) + ((x >> 8) & (0x00ff00ff));
는 이제 x
의 상부 및 하부 절반을 합산하고, 우리는 x
의 값에 설정된 비트 수에 해당하는 32 비트 값으로 남겨진다. 여기
x = (x & (0x0000ffff)) + ((x >> 16) & (0x0000ffff));
키 우리는 32 비트 정수 그 자체의 총 비트 수로 남을 때까지의 각 단계의 비트 인플레 이스 페어 수가 없다는 것이다.
숙제입니까? – Femaref
http://graphics.stanford.edu/~seander/bithacks.html에서 "Count bits set, in parallel"을 검색하십시오. – paxdiablo
@Femaref 아니, 그렇지 않아. 어떻게 작동하는지 파악하고 싶습니다. – herohuyongtao