바이너리 연산만으로 1 바이트 해밍 웨이트의 표현식을 작성해야합니다 (&, ^, >>); 어떤 고리도없이 그냥 수식.해밍 웨이트는 바이너리 연산으로 만 쓰여졌습니까?
나는 해밍 무게를 계산할 수있는 많은 알고리즘이 있지만, 모두 산술 연산이나 루핑을 사용한다는 것을 알고있다.
우리 http://en.wikipedia.org/wiki/Hamming_weight에서 알고리즘 후 제 합 D = B + C가 D = B^C^(B & C < < 1)로 작성하지만, 다음 두 합이 더 복잡 할 수 걸리는 경우.
힌트가 있습니까?
업데이트 : 도움 주셔서 감사합니다.
int popcount_1(unsigned char in){
unsigned char m1 = 0x55;
unsigned char m2 = 0x33;
unsigned char m4 = 0x0f;
unsigned char B,C = 0;
unsigned char x = in;
x = (x & (x << 1) & (m1 << 1)) | (m1 & (x^(x >> 1)));
B = x & m2;
C = (x >> 2) & m2;
x = B^C^((B & C) << 1);
B = (x & m4)^((x >> 4) & m4);
C = (x & ((x >> 4) & m4)) << 1;
x = B^C^((B & C) << 1);
return x;
}
이 코드는에 변수 의 무게를 해밍가 발생합니다 : 사실, 나는 다음과 같은 무언가를 필요로했다. +, - 또는 비교 명령어가 포함되어 있지 않으며 8 비트 마이크로 컨트롤러에서 작동 할 수 있습니다. 그러나 대부분의 다른 솔루션보다 많은 작업이 필요합니다. 이제, 나는 그것을 단순화하려고 노력하고있다.
UPDATE2 : 또 다른 해결책, 64 개 비트 레지스터를 기반으로, @Evgeny Kluev에 의해 제안
이 숙제가 있습니까? – Poindexter
Nop, 그렇지 않습니다. 해밍 무게/거리를 기반으로 차동 전력 분석 공격에서 핵심 검색을 최적화하는 분석 식을 유도하기 위해이 작업을 수행하고 있습니다. 사실, 나는이 표현을 거의 발견 했으므로 곧 게시 할 것입니다. – Roman
최적화를 위해서라면 두 가지 제약 조건이 모두 존재해야하며 "어떤 방법이든 가장 빠릅니다"(플랫폼 의존적 임) – harold